2013-04-28 239 views
0

我試圖重載賦值運算符有兩個不同的模板類,但具有相同的模板類型:重載賦值運算符

template <class DataType> class Foo 
{ 
    public: Foo<data_type>& operator=(Bar<data_type> const &bar); 
}; 
template <class DataType> class Bar 
{ 
    public: Bar<data_type>& operator=(Foo<data_type> const &foo); 
}; 

然而,當我嘗試:

Foo<int> a; 
Bar<int> b = a; 

我得到的錯誤:

No viable conversion from 'Foo< int >' to 'Bar< int >'.

我該如何做到這一點?

+0

注意,給出的例子將失敗,並多次編譯錯誤它得到轉換的問題很久以前。 – 2013-04-28 19:17:13

回答

1

轉換是通過複製構造函數完成的,而不是賦值運算符。所以,要實現:

Bar(const Foo<data_type>& foo); 
1

當你寫:

Bar<int> b = a; // ERROR! No viable user-defined conversion sequence 

您是副本初始化對象b從對象a。這是不是相同將對象a分配給已經構建的對象b,儘管使用了=符號。

與複製初始化,編譯器必須尋找,可以轉換成aBar<int>類型的對象,從該b可以最終拷貝構造或移動構造的一個用戶定義的轉換序列。

分配,而另一方面,將工作:

Foo<int> a; 
Bar<int> b; 
b = a; // OK