2012-02-21 16 views
-1

シンプルなテンプレートを作成しました。それは私に警告を与えます:「戻り値はありません。C++テンプレートエラー、戻り値が返されません。非voidを返します。

template<typename T> struct test { 
public: 
    test & operator=(const T & new_value) { 
     value = new_value; 
    } 
    operator T() const { 
     return value; 
    } 
private: 
    T value; 
}; 

警告は、誰もがこの警告を修正する方法についていくつかのアドバイスを提供することができます

test & operator=(const T & new_value) { 
    value = new_value; 
} 

を指しています。

+11

Uh ..何かを返しますか? (おそらく '* this') – ildjarn

+0

ありがとう、それは今動作します。私が*これを返すと、実際に何が返ってくるのですか? – 2607

+6

あなたは[良い本](http://stackoverflow.com/q/388242/636019)... – ildjarn

答えて

2

警告として、test &を返すことを約束していますが、あなたの関数は何も返しません。代入演算子の通常の規約と同様に、関数を終了するだけでreturn *this;となります。

1

operator=関数は、testというオブジェクトへの参照を返すと仮定すると、何も返しません。そのメソッドことメモリ内インスタンスクラス自体を指しているポインタであるクラスの暗黙thisポインタにアクセスすることにより(すなわち

test& operator=(const T & new_value) 
{ 
    value = new_value; 

    //dereference the "this" pointer to get a lvalue reference to 
    //the current object 
    return *this; 
} 

注:これに

test& operator=(const T & new_value) 
{ 
    value = new_value; 
} 

:これを変更しますが呼び出されています)、逆参照すると、クラスインスタンスの左辺値参照にアクセスしています。したがって、クラスメソッドから左辺値参照を返す場合、その参照を引数として参照を取る他の関数に渡すことができ、および/または返されたクラスインスタンスに対して他のメソッドを呼び出すことができます。これにより、operator=が関数とメソッド呼び出しの "チェーン"で使用され、operator=メソッドが呼び出された後、結果の変更されたオブジェクトインスタンスに対して別のメソッドが呼び出されます。たとえば、あなたが何かを行うことができます:あなたはtestオブジェクトに対してprint()メソッドを作成した場合

test<int> a; 
a.value = 5; 

int b = (a = 6) + 5; //outputs the value 11 

を、あなたはまた、次のような何かができる:

test<int> a; 
a.value = 7; 
(a = 8).print(); 

このコードは、testクラスを返します。インスタンスaoperator=メソッドの後に呼び出し、そのインスタンスのprint()メソッドを呼び出し、値8を出力します。

0

オペレータ=オーバーロードが正しくないことをコンパイラから通知しています。 operator = overload関数を書くには、特定の形式に従う必要があります。

Test & Test::operator=(const Test & r) 
{ 
    if(this != &r) 
    { 
     // copy member variables and initialize here 
     m_MemberVar = r.m_MemberVar; 
     ... 
    } 

    return *this; 
} 

NB

  1. あなたは*これを返さなければなりません。あなたは演算子をオーバーロードした場合
  2. それはあなたが

    if(this != &r){...} 
    
  3. で自身にオブジェクトをコピーしないことを保証するために、良い習慣だ=オブジェクトのために、あなたはほぼ確実に、あまりにもコピーconstuctorを提供する必要があります。例えば

    Test::Test(const Test & r){...} 
    

EDIT

あなたはまあ、それは現在のオブジェクトへの参照を返します "私は*これを返した場合、それが実際に何を返さない" 尋ねたのです。例えば。上記のoperator = overload定義では、戻り値のタイプはTest &(Test object reference)として宣言されています。

関連する問題