2012-10-13 105 views
1

我想知道以下是否可能。 可以說我有這樣的代碼:同一個模板互相交互的不同類的類型

template <class NumberType> 
struct Number 
{ 
    NumberType value; 

    void operator = (Number in_val) 
    { 
     value = in_val; 
    } 
} 

於是我就能夠做這樣的事情:

Number<int> n1, n2; 
n2.value = 5; 
n1 = n2; 
cout << "Value: " << n1.value << endl; 

但這不會讓我做到以下幾點:

Number<int> n1; 
Number<double> n2; 
n2.value = 5; 
n1 = n2; 
cout << "Value: " << n1.value << endl; 

如何使這成爲可能? 我是否必須用另一個包裝這個結構/類還是我必須做一些奇特的遞歸?

p.s. 我已經使用C++一段時間了,但從未嘗試過templates。所以認爲我對模板非常陌生。

- 編輯 - 好吧,我現在正確地得到它。但另一個相關的問題來了。

template<class OtherNumType> 
Number& operator *= (const OtherNumType& in_value) 
{ 
    value *= in_value; 
    return *this; 
} 

這給出了編譯錯誤。爲什麼?什麼是正確的方法?

+0

對於新內容(編輯後),最好發佈一個新問題。 (但是,我認爲編譯失敗的原因與你用於'OtherNumType'的類型有關,如果某個'T'是'Number ',則必須將函數定義更改爲'value * = in_value.value '。) – jogojapan

+0

沒有它只是一個整數 – Deamonpog

+0

你得到什麼錯誤? (或者你是否發佈了一個單獨的問題?) – jogojapan

回答

1

Number<T>模板定義是由編譯器對任何特定類型的T,名稱Number(作爲類型名稱使用時)被認爲被解釋爲Number<T> ,不管T可能在那個時候。

因此,對於Number<int>,當前模板定義僅適用於下面的賦值操作符提供:

void operator=(Number<int> in_val) 

因爲Number在這一點上解釋爲Number<int>

爲了使操作更加靈活,你可以把它變成一個成員模板(在已模板類模板化的功能):我怎麼修改了運營商不僅要接受

template <class NumberType> 
struct Number 
{ 
    NumberType value; 

    template <typename T2> 
    Number &operator=(const Number<T2> &in_val) 
    { 
    value = in_val.value; 
    return *this; 
    } 
}; 

Number<T2>任何類型T2,但也使它返回*this並接受參數作爲常量引用–這是定義賦值運算符最常見和有用的方法。

+0

謝謝你的所有信息。我在很多地方都看到了賦值運算符的這種實現(沒有模板的東西),並且有時也會盲目地使用它。我明白爲什麼我們會返回保存的值以及爲什麼使用「const」關鍵字。但我總是想知道爲什麼我們將這個值作爲參考。這會是一件壞事嗎?我的意思是如果有人把它作爲指針並改變它,它會改變對象內部的值,儀式?這應該是一個單獨的問題。但如果你有任何鏈接,我會去那裏學習:)非常感謝你們所有人:) – Deamonpog

+0

@Deamonpog我們不返回保存的值;我們返回'* this',這是對當前對象的引用。我們通過引用而不是指針來做這件事的原因是它可以很容易地使分配操作成爲操作鏈的一部分,例如,如果你有對象'Number n1,n2',你可以這樣做:'if((n1 = f(x))== n2)'。即你將一個賦值('f(x)'的結果賦值給'n1'),然後立刻用它來比較(到'n2')。如果我們返回了一個指針,我們將不得不對其進行解引用,而我們的代碼將不那麼直觀。 – jogojapan

+0

是的,我明白這一點。我的意思是說某人可以做一件事情,比如# * p =&(n1 = f(x));'rite? – Deamonpog

1

可以提供一個模板操作員=

template<class OtherNumType> 
Number<NumberType>& operator= (const Number<OtherNumType>& in_val) 
{ 
    value = in_val.value; // ok if the number types are implicitly convertable 
    return *this; 
} 
+0

非常感謝。 – Deamonpog

相關問題