我有以下无法编译的代码,提示 += 运算符不存在。 += 运算符在这里在 A 类之外声明。
template < typename _T >
class A {
public:
operator _T () const { return 42 ; }
};
template <typename _T >
A< _T > & operator += ( A< _T > & l, _T r ) { return l ; }
int main() {
A< int > e, f ;
e += f ;
return 0 ;
}
但是,如果我在类 A 中实现运算符,代码会编译并运行:
template < typename _T >
class A {
public:
operator _T () const { return 42 ; }
A< _T > & operator += ( _T r ) { return *this ; }
};
int main() {
A< int > e, f ;
e += f ;
return 0 ;
}
这两个代码有什么区别?他们不应该是等价的吗?
这是用 gcc 4.4.7-4 编译的。
最佳答案
第一个示例无法编译,因为模板参数推导没有进行任何转换。与
template <typename _T >
A< _T > & operator += ( A< _T > & l, _T r ) { return l ; }
两者都是 l
和 r
有助于确定什么_T
是。当你做 e += f
然后编译器得到 _T
必须是 int
对于 l
它得到 r
必须是 A<int>
因为那是 f
的类型.由于它们不匹配,因此无法编译。
在第二个代码中,没有进行模板参数推导。编译器知道什么 _T
来自类的实例化,所以它需要做的就是转换传递给 r
的内容到 _T
.
我还建议您改掉以下划线开头的习惯。有很多关于它们的规则,如果你违反了它们,那么你的程序就会有未定义的行为,因为它们是为实现而保留的。有关更多信息,请参阅 What are the rules about using an underscore in a C++ identifier?
关于c++ - 内部和外部重载 C++ 运算符之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41247318/