2017-07-26 78 views
3

下面的函数将存储在类cVector中的内容转换为std::vector,并返回它。重载赋值运算符以返回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"

我不知道是怎么回事错在这里,我希望有人能帮助/解释。

+0

你不应该用返回值重载。这纯粹是错误的。 –

+0

分配运营商应该返回对“* this”的引用。 – HatsuPointerKun

+0

为什么你想首先编写自己的矢量类?无论你想达到什么目标,都可能已经可以实现(并且以更好的方式实现),使用'std :: vector'。 –

回答

1

赋值运算符通常看起来有点像这样:

class C 
{ 
public: 
    C& operator=(const C& other) {...} 
}; 

它被用于一些分配给类C的实例而不是其他类的东西。你可以重载它,这样它就可以获得其他类的对象,并将它们分配给你的类,而不是相反。所以

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

将采取的价值观里面other,并将其分配给您的cVector。 如果你想做其他的事情,只需使用convertToStdVector函数。

+1

*“赋值运算符通常看起来有点像这样”* - 不,它不。它的标准签名是这样的,它返回'C&'。 –

+1

@ChristianHackl是的,你是对的......我对评论感到困惑......修正了它。 – muXXmit2X

5

您定义的赋值运算符实际上是将cVector分配给另一个cVector,而不是将其转换为std::vector,这正是您想要的。

你所寻找的是超载conversion operator

operator std::vector<T>() const { ... }