C++ 重载运算符=模板类内部 模板类A { ... ClassA&运算符=(const ClassA&); ... }; //案例一: 模板 ClassA&ClassA::运算符=(常量ClassA&rhs) { ... } //案例二: 模板 ClassA&ClassA::运算符=(常量ClassA&rhs) { ... }
我想案例一是正确的C++ 重载运算符=模板类内部 模板类A { ... ClassA&运算符=(const ClassA&); ... }; //案例一: 模板 ClassA&ClassA::运算符=(常量ClassA&rhs) { ... } //案例二: 模板 ClassA&ClassA::运算符=(常量ClassA&rhs) { ... },c++,templates,C++,Templates,我想案例一是正确的 问题>为什么我们不必在函数参数列表中使用ClassA,例如在案例2中?当它在函数参数范围内(但不在返回类型中)时,它是隐含的。另请参见使用嵌套类作为参数类型。如您所见,两种版本都适用 一旦我们通过了ClassA::部分ClassA&ClassA::operator=(const ClassA&rhs)它的行为就好像我们在类中一样。例如,运算符可以访问类的所有成员 您必须为返回值指定全名,因为此时我们仍然不知道这是一个成员函数(或运算符)。我被告知“我们必须为类模板的名称指定模
问题>为什么我们不必在函数参数列表中使用
ClassA
,例如在案例2中?当它在函数参数范围内(但不在返回类型中)时,它是隐含的。另请参见使用嵌套类作为参数类型。如您所见,两种版本都适用
一旦我们通过了ClassA::
部分ClassA&ClassA::operator=(const ClassA&rhs)
它的行为就好像我们在类中一样。例如,运算符可以访问类的所有成员
您必须为返回值指定全名,因为此时我们仍然不知道这是一个成员函数(或运算符)。我被告知“我们必须为类模板的名称指定模板参数,但在类本身的范围内除外。这里的函数参数不在classA的范围内,所以我认为我们必须使用案例二而不是案例一。“@iammilind:你投票赞成是因为隐含性吗?@phresnel.这是一个简短的:)。+1代表一个好问题。“因为它是隐含的”,这就是我认为的答案。@iammilind:啊,我明白了:D
template<typename T> ClassA
{
...
ClassA& operator=(const ClassA&);
...
};
// case one:
template<typename T>
ClassA<T>& ClassA<T>::operator=(const ClassA &rhs)
{ ... }
// case two:
template<typename T>
ClassA<T>& ClassA<T>::operator=(const ClassA<T> &rhs)
{ ... }