2012-01-25 16 views
1

なぜこのコードは "operator ="を出力しませんか?なぜテンプレート演算子のオーバーロードが機能しないのですか?

#include <iostream> 
using namespace std; 

class A{ 
public: 
    template<typename T> void operator=(const T& other){ 
     cout<<"operator="<<endl; 
    } 
}; 

int main(){ 
    A a; 
    A b; 
    a=b; 
} 
+5

これは単なる代入演算子なので、実際にここで呼び出されている_copy-assignment_演算子がコンパイラによって暗黙的に生成されることはありません。 – ildjarn

答えて

7

コンパイラが生成コピー代入演算子はオーバーロードの解決によって選択されます。

class A{ 
public: 
    A& operator=(A const& other){ 
    std::cout << "copy assignment\n"; 
    return *this; 
    } 
    template<class T> 
    void operator=(T const& other){ 
    std::cout << "templated assignment\n"; 
    } 
}; 

は、「コピーの割り当て」を印刷し、コンパイラはあなたのために生成されるものと本質的に同じである(印刷なし、の意志コース)。

+0

私は演算子=がコンパイラによって合成されていることを知っていました。暗黙の質問は、私の演算子=テンプレートを使用するように強制する方法はありますか? –

+0

他のものをプライベートと空として定義して、使用されないようにすることができます。 – AJG85

+0

@ildjarn:いいえ、オーバーロードの解像度はプライベートの解像度を選択し、アクセス/削除エラーを引き起こします。過負荷の解決中はアクセスチェックは行われません。 – Xeo

関連する問題