2012-04-02 87 views
2

當編譯如下:默認賦值運算符參數

template <class T> 
class Number 
{ 
    private: 
     T num; 
    public: 
     Number() {} 
     Number(T n) : num(n) {} 
     operator T() const { return num; } 
}; 

int main() 
{ 
    Number<int> n=5; 
    Number<char> c=4; 
    int i; 

    c=int(5); 
    i=n; 
    c=n; 

    return 0; 
} 

編譯器卡在第三次分配說沒有匹配在c=noperator=n不應該轉換爲int,而這又將被分配到c

回答

4

根據標準,最多隻有一個用戶定義的轉換(構造函數或轉換函數)隱式應用於單個值。在此,您希望編譯器將Number<char>的構造函數和Number<int>的轉換運算符應用。請參閱:https://stackoverflow.com/a/867804/677131

2

這是因爲在使用模板類型char構建模板類時,沒有int運算符。

實際上,您在這裏沒有assigment運算符,只有構造函數和類型運算符。這意味着你的編譯器很可能已經把可能的線沿線的一個默認:

Number<T>& operator=(Number<T>& rhs); 

你應該實現自己的賦值運算符,這應該解決您的問題。通用解決方案可能如下,但依賴於類型之間的有效分配。

template <typename T, typename V> 
class Number 
{ 
    private: 
     T num; 
    public: 
     Number() {} 
     Number(T n) : num(n) {} 
     operator T() const { return num; } 
     operator=(V& rhs){ num = rhs; // etc } 
}; 

你也需要讓你的類的構造函數explicit避免隱式轉換(除非這是你想要的)。

+0

'模板類被構造爲一個char' - 我有很大的問題試圖找出你的意思。一個被構造的類作爲a_'char'? – sehe 2012-04-02 11:40:48

+0

'n'被構造爲一個'int'。它有一個'int'運算符。 'c'可以被分配'int's。順便說一句,它不會以另一種方式工作,所以問題不在於將'int'賦值給'char'。 – baruch 2012-04-02 11:42:49

+0

你能澄清一下嗎?我不明白問題是什麼。 – baruch 2012-04-02 11:45:23