2016-11-23 1 views
4

私はテンプレート関数を書いています。テンプレート変数をゼロに初期化したいと思います。私はゼロに等しい変数を設定することを考えて、その後、クラスタイプが「ゼロ」の独自の定義を定義できました。クラスをゼロとして割り当てることを許可する

T data = 0; 

私は代入演算子のオーバーロードしようとした:

class Example{ 
public: 
    int data; 
    Example(){} 
    Example& operator=(int v){ 
     data = v; 
     return *this; 
    } 
}; 

template <class T> T test(){ 
    T data = 0; 
    return data; 
} 

int main(int argc, char** argv){ 
    double v1 = test<double>(); 
    Example v2 = test<Example>(); 
    return 1; 
} 

を...しかし、コンパイラは私に "エラー: 'int型から非スカラー型への変換..."を与えます。どうすればこの作品を作れますか?または私がやろうとしていることをするためのより良い方法がありますか?

+2

おそらく、あなたはパラメータとして 'int'を取るコンストラクタが必要です。 –

+0

変数をゼロに設定する代わりに、変数を実際に[値の初期化](http://en.cppreference.com/w/cpp/language/value_initialization)する必要があるようです。 ( 'T data = 0;'は 'data'に' 0'を代入するのではなく、 '0'から' data'を構築しようとしていますが、混乱します) – user2357112

+0

Hmmm、プリミティブ。 – Azmisov

答えて

2

コードに問題があると、T data = 0;は実際にはoperator=ではなく、コンストラクタを呼び出します。したがって、コードを動作させるには、intを受け入れるコンストラクタを宣言する必要があります。

0

クラスを0に割り当てることに注意してください。

template <class T> T test(){ 
    T data{}; 
    return data; 
} 

は、それが正しく任意のデフォルト構築可能なタイプを構築し、初期化しゼロになる、内蔵などdoubleintなどの種類:あなたは、ブレースの初期化を使用する必要があります。

関連する問題