我正在尝试重载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();
}
答案 0 :(得分:5)
与临时工作合作,例如
const
赋值运算符的参数应为SomeClass<T, P>& operator=(const SomeClass<T, P>& src)
^ ^^^^^
引用。
a = b = c;
赋值运算符通常也返回对指定对象的引用(因此可以在server.log
等链式赋值中使用)。按价值返回会创建一个我们可能不想要的附加副本。
答案 1 :(得分:2)
只需将作业运营商的签名更改为:
SomeClass<T, P>& operator=(SomeClass<T, P> const &src)
^ ^^^^^
您必须通过引用返回以允许分配链接,如下所示:
SomeClass<T, P> a, b, c;
a = b = c;
输入参数必须为const
引用,否则您将无法分配临时对象。