【发布时间】:2015-02-25 01:21:58
【问题描述】:
在C++ 模板完整指南中的第 5.3 节成员模板中写道:
请注意,模板赋值运算符不会替换默认值 赋值运算符。对于相同类型的栈的赋值, 仍然调用默认赋值运算符。
这是正确的,因为当我运行下面的代码时:
#include<iostream>
using namespace std;
template<typename T>
class Pair
{
public:
T pair1,pair2;
Pair(T i,T j):pair1(i),pair2(j){}
template<typename T1>Pair<T>& operator=(Pair<T1>&);
};
template<typename T>
template<typename T1>
Pair<T>& Pair<T>::operator=(Pair<T1>& temp)
{
this->pair1 =temp.pair1*10;//At this point
this->pair2=temp.pair2;
return *this;
}
int main()
{
Pair<int>P1(10,20);
Pair<int>P2(1,2);
P2=P1;
cout<<P2.pair1<<' '<<P2.pair2<<endl;
return 1;
}
我得到答案 100 20。
它没有给出默认的作业答案。
这是 C++ 模板完整指南中的输入错误吗?
C++ 模板:完整指南 David Vandevoorde, Nicolai M. 约苏蒂斯
出版商:艾迪生韦斯利
发布日期:2002 年 11 月 12 日 页数:552
【问题讨论】:
-
我认为
Pair<T1>& temp在传入非const左值时不涉及const限定,所以这是一个更好的转换序列 -
两个赋值运算符都存在于
Pair中,并参与重载决议。因为模板化的引用采用非 const 引用,而隐式声明的引用采用 const 引用,在这种情况下前者是更好的匹配。一旦您更改模板化的引用以获取 const 引用,隐式定义的引用就会按您的预期调用。 Live example