2017-07-26 11 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

代入演算子は、通常、多少のようになります別のクラスのものではない。あなたはそれをオーバーロードすることができるので、他のクラスのオブジェクトを受け取り、それらをあなたのクラスに割り当てますが、それ以外の方法は割り当てません。だから、

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

other内の値を取り、あなたのcVectorに割り当てます。 他のことをしたい場合は、convertToStdVector機能を使用してください。

+1

* "代入演算子は通常、このように見えます" * - いいえ、そうではありません。その標準的な署名は、 'C&'を返すようなものです。 –

+1

@ChristianHacklはい、あなたは正しいです...私はコメントによって混乱しました...それを修正しました。 – muXXmit2X

5

あなたが定義した代入演算子は実際にはcVectorを別のcVectorにアライメントするためのものであり、std::vectorへの変換ではありません。 conversion operatorをオーバーロードされて何を探してるんです

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

クラスのインスタンスに何かを割り当てるために使用されてC

operator std::vector<T>() const { ... } 
関連する問題