模板类的重载赋值操作符

overload assignment operator for template class

本文关键字:重载 赋值操作符      更新时间:2023-10-16

我正在尝试超载operator=(),但我正在获得error: no viable overloaded '='。但我不明白为什么。我遗漏了什么?在类模板中重载赋值操作符可以强制转换为另一种模板类型,但有人说要给返回类型的模板参数一个新类型…? 这将导致编译器向我抱怨未知类型。

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

}

使用临时文件,如

   sc = someclass_type();

赋值操作符的形参必须是一个const引用。

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

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

只需将赋值操作符的签名更改为:

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

你必须通过引用返回来允许赋值链,如下所示:

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

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