模板类的重载赋值运算符

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&lt;T, P&gt;。您可以只使用SomeClass 不相关,但运算符定义中的&lt;T, P&gt; 不是必需的。而且您实际上不需要实现赋值运算符。 顺便说一句,实现可以简单地是 vectorfield = src.vectorfield; return *this; 甚至SomeClass&amp; operator=(const SomeClass&amp; 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++中的模板继承的类重载赋值运算符

C++初阶:类和对象(中篇)构造函数 | 析构函数 | 拷贝构造函数 | 赋值运算符重载

C++类与对象(详解构造函数,析构函数,拷贝构造函数,赋值重载函数)

模板类的赋值运算符