模板 class 的重载赋值运算符

overload assignment operator for template class

我正在尝试超载 operator=(),但我得到 error: no viable overloaded '='。但我不明白为什么。我在这里错过了什么?我厌倦了 Overloading assignment operator in a class template that can cast to another template type 中的答案,但有人说要给 return 类型的模板参数一个新类型...?这导致编译器为我抱怨未知类型。

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();


}

只需将您的赋值运算符的签名更改为:

SomeClass<T, P>& operator=(SomeClass<T, P> const &src)
               ^                           ^^^^^

您必须通过引用 return 才能允许赋值链接,如下所示:

SomeClass<T, P> a, b, c;
a = b = c;

输入参数必须是const引用,否则您将无法分配临时对象。

与临时工一起工作,例如

   sc = someclass_type();

赋值运算符的参数应该是一个const引用。

SomeClass<T, P>& operator=(const SomeClass<T, P>& src)
               ^           ^^^^^

赋值运算符通常也 returns 是对赋值对象的引用(因此它可以用于链式赋值,如 a = b = c;)。按值返回会创建一个额外的副本,我们可能不希望这样。