gpt4 book ai didi

c++ - 模板基类的模板运算符重载

转载 作者:行者123 更新时间:2023-11-28 06:30:09 26 4
gpt4 key购买 nike

我在调用模板基类的模板赋值运算符重载方法时遇到问题。这是我目前所拥有的:

基类.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>
{
};

主要.cpp:

#include "ChildClassInt.h"
#include "ChildClassFloat.h"

int main()
{
const ChildClassFloat floatClass;

ChildClassInt intClass;

return 0;
}

如何调用 intClassoperator=() 方法并将其传递给 floatClass

最佳答案

intClass总是有一个隐式定义的赋值运算符,它总是对基类隐藏赋值运算符。要显式调用基类赋值运算符需要显式限定:

intClass.BaseClass<int>::operator=(floatClass);

(注意:您的代码有两个错误。首先,BaseClass<int>::operator= 是私有(private)的。其次,它应该返回 *this,而不是 this。)

但是,您可能不应该这样做。通常,分配给子对象可能会导致完整对象损坏,因为基类分配运算符不知道派生类的不变量。如果你真的需要分配一个 ChildClassFloatChildClassInt ,你应该定义一个赋值运算符:

ChildClassInt& ChildClassInt::operator=(const ChildClassFloat& c) {
BaseClass<int>::operator=(c);
return *this;
}

然后用户可以这样做:

intClass = floatClass;

因为这个赋值运算符是 ChildClassInt 实现的一部分,它知道如何以保留 ChildClassInt 的不变量的方式执行分配。并将在必要时在实现发生变化时进行更新。另一方面,不能指望用户知道直接对基类执行部分赋值是否可行,即使可行,用户代码也可能随时因类实现的更改而中断。

关于c++ - 模板基类的模板运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27749736/

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