模板类的重载赋值运算符

时间:2015-10-07 06:36:13

标签: c++ templates assignment-operator

我正在尝试重载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();


}

2 个答案:

答案 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引用,否则您将无法分配临时对象。