模板基类的模板运算符重载

时间:2015-01-02 23:04:08

标签: c++ templates

我无法调用模板基类的模板赋值运算符重载方法。这就是我到目前为止所做的:

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

1 个答案:

答案 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>