2015-10-07 71 views
0

我试图超载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(); 


} 
+1

FWIW,您不需要在类模板中使用'SomeClass '。你只能使用'SomeClass'。 –

+1

无关,但操作符定义中的''不是必需的。而实际上你并不需要实现一个赋值操作符。 – juanchopanza

+1

顺便说一句,实现可以简单地为'{vectorfield = src.vectorfield;返回*这个; }'甚至'SomeClass&operator =(const SomeClass&rhs)= default;' – Jarod42

回答

5

要使用的临时工作,就像在

sc = someclass_type(); 

参数赋值操作符应该是一个const参考。

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

赋值运算符还通常回报参考分配的对象(因此它可以在链式分配被用于像a = b = c;)。按值返回会创建一个额外的副本,这可能不是我们想要的。

+3

并返回一个参考。 –

+0

@πάνταῥεῖ - 啊,对! –

2

只要改变你的赋值运算符的签名:

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

你必须参考返回允许转让链接,如下所示:

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

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

+0

返回一个引用可能会有所帮助。 – juanchopanza

+0

@juanchopanza感谢更正:) – 101010