2012-01-25 48 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

我知道运算符=正在被编译器合成。隐含的问题是:有没有办法强制它使用我的operator = template? –

+0

您可以将其他人定义为私人和空的,以便不使用它们。 – AJG85

+0

@ildjarn:没有,重载解析仍然会选择私人的并触发访问/删除错误。访问检查不是在重载解析期间完成的,而是之后才进行的。 – Xeo