【问题标题】: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;

标签: c++ templates assignment-operator


【解决方案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; 这样的链式赋值)。按值返回会创建一个额外的副本,这可能是我们不想要的。

【讨论】:

  • 并返回一个参考。
猜你喜欢
  • 2011-08-03
  • 1970-01-01
  • 2019-06-30
  • 2011-11-14
  • 1970-01-01
  • 2015-01-27
  • 1970-01-01
相关资源
最近更新 更多