2017-07-26 79 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 { ... }