c++ - 内部和外部重载 C++ 运算符之间的区别

标签 c++ class templates operator-overloading

我有以下无法编译的代码,提示 += 运算符不存在。 += 运算符在这里在 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 ; }

两者都是 lr有助于确定什么_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/

相关文章:

c++ - 将布局从一个类添加到另一个类在 Qt 中不起作用

c++ - 多个翻译单元中是否允许模板变量并有效合并?

c++ - 在 C++ 中使用附加模板参数扩展模板化结构

c++ - 模板特化在其实例化点看不到函数

c++ - 创建 C++ 类图

C++纯虚函数继承(相同签名)

c++ - QQmlApplicationEngine 和 WindowFlags

php - 从另一个类获取已创建的 mysqliDb 连接

class - 如何处理类内部的多态性

PHP __toArray() 或 __toObject() 覆盖?