我无法调用模板基类的模板赋值运算符重载方法。这就是我到目前为止所做的:
BaseClass.h:
template<typename T>
class BaseClass
{
template<typename U>
BaseClass<T>& operator=(const BaseClass<U>& o)
{
return *this;
};
};
ChildClassInt.h:
#include "BaseClass.h"
class ChildClassInt : public BaseClass<int>
{
};
ChildClassFloat.h:
#include "BaseClass.h"
class ChildClassFloat : public BaseClass<float>
{
};
main.cpp中:
#include "ChildClassInt.h"
#include "ChildClassFloat.h"
int main()
{
const ChildClassFloat floatClass;
ChildClassInt intClass;
return 0;
}
如何调用operator=()
的{{1}}方法并将其传递给intClass
?
答案 0 :(得分:1)
intClass
总是有一个隐式定义的赋值运算符,它始终隐藏基类的赋值运算符。要显式调用基类赋值运算符,需要明确限定:
intClass.BaseClass<int>::operator=(floatClass);
(注意:您的代码有两个错误。首先,BaseClass<int>::operator=
是私有的。其次,它应该返回*this
,而不是this
。)
然而,你可能不应该这样做。通常,分配给子对象可能会导致完整对象损坏,因为基类赋值运算符不知道派生类的不变量。如果您确实需要为ChildClassFloat
分配ChildClassInt
,则应定义分配运算符:
ChildClassInt& ChildClassInt::operator=(const ChildClassFloat& c) {
BaseClass<int>::operator=(c);
return *this;
}
然后用户可以这样做:
intClass = floatClass;
由于此赋值运算符是ChildClassInt
实现的一部分,因此它知道如何以保留ChildClassInt
的不变量的方式执行赋值,并在实现更改时根据需要进行更新。另一方面,不能指望用户知道直接执行对基类的部分分配是否有效,并且即使这样做,也可以通过改变类实现随时破坏用户代码。 / p>