模板类的重载赋值运算符
Posted
技术标签:
【中文标题】模板类的重载赋值运算符【英文标题】:overload assignment operator for template class 【发布时间】:2016-01-04 06:36:12 【问题描述】:我正在尝试超载operator=()
,但我得到了error: no viable overloaded '='
。但我不明白为什么。我在这里想念什么?我厌倦了Overloading assignment operator in a class template that can cast to another template type 中的答案,但有人说要给返回类型的模板参数一个新类型......?这导致编译器为我抱怨未知类型。
template<typename T, typename P>
class SomeClass
public:
SomeClass<T, P> operator=(SomeClass<T, P>& src)
if (this != &src)
vectorfield.resize(src.vectorfield.size());
for (int i = 0; i < src.vectorfield.size(); ++i)
vectorfield[i] = src.vectorfield[i];
return *this;
private:
std::vector<std::vector<std::string>> vectorfield;
;
template<typename SC>
class SomeOtherClass
public:
typedef SC someclass_type;
void func()
sc = someclass_type();
private:
someclass_type sc;
;
int main()
typedef SomeClass<int, int> SCII;
typedef SomeOtherClass<SCII> SOC_scii;
SOC_scii soc_scii;
soc_scii.func();
【问题讨论】:
FWIW,你不需要在类模板中使用SomeClass<T, P>
。您可以只使用SomeClass
。
不相关,但运算符定义中的<T, P>
不是必需的。而且您实际上不需要实现赋值运算符。
顺便说一句,实现可以简单地是 vectorfield = src.vectorfield; return *this;
甚至SomeClass& operator=(const SomeClass& rhs) = default;
【参考方案1】:
只需将赋值运算符的签名更改为:
SomeClass<T, P>& operator=(SomeClass<T, P> const &src)
^ ^^^^^
您必须通过引用返回以允许分配链接,如下所示:
SomeClass<T, P> a, b, c;
a = b = c;
输入参数必须是const
的引用,否则您将无法分配临时对象。
【讨论】:
返回参考可能会有所帮助。【参考方案2】:与临时工一起工作,例如在
sc = someclass_type();
赋值运算符的参数应该是const
引用。
SomeClass<T, P>& operator=(const SomeClass<T, P>& src)
^ ^^^^^
赋值运算符通常还返回对已分配对象的引用(因此它可以用于像a = b = c;
这样的链式赋值)。按值返回会创建一个额外的副本,这可能是我们不想要的。
【讨论】:
并返回一个参考。以上是关于模板类的重载赋值运算符的主要内容,如果未能解决你的问题,请参考以下文章
C++初阶:类和对象(中篇)构造函数 | 析构函数 | 拷贝构造函数 | 赋值运算符重载