gpt4 book ai didi

c++ - 为什么运算符重载失败?

转载 作者:太空狗 更新时间:2023-10-29 23:36:56 24 4
gpt4 key购买 nike

在下面的代码中,我举例说明了运算符重载:

#include <iostream>
using namespace std;

template <typename T>
class A
{
public:
A() {};
A( T &obj) {value = obj;};
~A() {};
T value;
template <typename E>
A<T>& operator = (const A<E> &obj)
{
cout<<"equal operator"<<endl;
if(this == &obj)
return *this;

value = obj.value;
return *this;
}

};



int main()
{
int temp;
temp = 3;
A<int> myobjects(temp);
cout<<myobjects.value<<endl;

temp = 7;
A<int> yourobjects(temp);
yourobjects = myobjects;
cout<<yourobjects.value<<endl;



return 0;
}

但是,当我调试这个程序时,我发现主程序并没有调用等于运算符重载函数。但是,如果我按以下方式更改相等运算符:

   A<T>& operator = (const A<T> &obj)
{
cout<<"equal operator"<<endl;
if(this == &obj)
return *this;

value = obj.value;
return *this;
}

它会起作用的。您知道为什么初始功能不起作用吗?

最佳答案

您的赋值运算符模板版本不会抑制为您的类生成编译器提供的非模板复制赋值运算符。编译器将隐式声明和定义具有以下签名的复制赋值运算符

A<T>& operator =(const A<T>&);

在复制分配的重载解析过程中,编译器提供的版本获胜(因为它更专业)。

您的赋值运算符模板版本只会被考虑用于转换赋值。例如。如果在某个时候你想分配 A<int>反对 A<double>对象,将使用您的赋值运算符模板版本。但是当你分配 A<int>A<int>您的运算符将被忽略,因为编译器声明的版本更匹配。

当您使用

声明您自己的复制分配版本时
A<T>& operator =(const A<T>&);

签名,它会抑制编译器生成的签名。您的版本已被使用。

这意味着如果您想要拥有自己的复制赋值运算符以及作为模板转换赋值运算符,您需要在您的类中显式实现两者

附言作为'@Cheers 和hth。 - Alf' 正确指出,您的赋值运算符模板版本在一般情况下甚至无效。指针 this&obj通常有不同的无关类型。不允许比较不同的不相关类型的指针。

关于c++ - 为什么运算符重载失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11399832/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com