重载赋值运算符以返回std::vector

4
下面的函数将存储在类中的内容转换为< std :: vector>并返回结果。
template <class T> std::vector<T> cVector<T>::convertToStdVector()
{
    std::vector<T> vec;
    vec.resize(m_nSize);
    for (unsigned i = 0; i < m_nSize; ++i) {
        vec[i] = m_pData[i];
    }
    return vec;
}

上述方法完美运行,现在我想重载赋值运算符并执行相同的操作,而不是使用这样的函数。
我尝试了以下代码:
template <class T> class cVector
{
public:

    cVector(unsigned nSize, AllocEnum eAllocType=MALLOC);
    cVector(T *pData, unsigned nSize, bool bCopy=false);

    // convert to std vector
    std::vector<T> operator=(const cVector<T> &cvec);

    //..
    //....
}

template <class T> std::vector<T> cVector<T>::operator=(const cVector<T> &cvec)
{
    std::vector<T> vec;
    vec.resize(m_nSize);
    for (unsigned i = 0; i < m_nSize; ++i) {
        vec[i] = m_pData[i];
    }
    return vec;
}

这段代码可以正常编译,但是当我在我的代码中调用它时,比如说:

std::vector<float> vec = cVectorInstance;

在编译过程中,我遇到了以下错误:

error: conversion from 'cVector' to non-scalar type 'std::vector >' requested"

我不确定出了什么问题,希望有人能够帮忙解决/解释。


你不应该使用返回值来重载函数,这是完全错误的。 - The Quantum Physicist
赋值运算符应该返回对 *this 的引用。 - HatsuPointerKun
你为什么要编写自己的向量类呢?无论你想实现什么,很可能都已经可以通过 std::vector 实现(而且以更好的方式实现)。 - Florian Winter
那是没有建设性的,Florian。即使对您看起来没有用处,也不意味着存在包含向量类的项目/代码库,这可能是由于遗留问题,无法轻松地快速删除,或者可能是由于要求存在的项目特定需求。无论哪种方式,告诉您我正在处理的项目具体细节完全超出了此问题的范围。 - Gio
如果你的 cVector 类有公共方法来返回数据缓冲区的指针,那么你可以简单地使用 std::vector 提供的各种构造函数,而不是编写模板类。或者,如果要进行赋值操作,可以使用 std::copy 并使用 std::back_inserter 将项目插入新向量中。 - PaulMcKenzie
2个回答

5
您定义的赋值运算符实际上是将一个 cVector 分配给另一个 cVector,而不是转换为 std::vector,这正是您想要的。
您要寻找的是重载 转换运算符
operator std::vector< T >() const { ... }

1
赋值运算符通常看起来像这样:
class C 
{
public:
    C& operator=(const C& other) {...}
};

它用于将某物分配给类 C 的实例,而不是其他类的实例。您可以重载它,以便它接受其他类的对象并将它们分配给您的类,但不能反过来。因此,

cVector& operator=(const std::vector<...>& other) { ... }

会将other中的值赋给你的cVector。如果想要做另一件事情,只需使用convertToStdVector函数。


1
“赋值运算符通常看起来像这样” - 不,它不是。它的标准签名是返回 C& - Christian Hackl
1
@ChristianHackl 是的,你说得对...我被评论搞混了...已经修复了。 - muXXmit2X

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接