2011-07-12 122 views
3

我是新來的C++,我試圖使用模板,但我有問題。 我想要做的是:嘗試使用模板來計算數字的平方,數字可能是像int,float這樣的基本數據類型,以及複數。我還用模板來實現一個複雜的類,而代碼如下:C++模板專門化方法問題

template <typename T> 
class Complex { 
public: 
    T real_; 
    T img_; 

    Complex(T real, T img) : real_(real), img_(img) { } 
}; 

template <typename T> 
T square(T num) { 
    return num * num; 
} 

template <> 
Complex<typename T> square(Complex<typename T> num) { 
    T temp_real = num.real_*num.real_ - num.img_*num.img_; 
    T temp_img = 2 * num.img_ * num.real_; 
    return Complex(temp_real, temp_img); 
} 

我試圖用模板特殊化處理的特殊情況,但它給了我錯誤:

using ‘typename’ outside of template 

和該錯誤發生在模板專門化方法上。請指出我的錯誤。謝謝。

+0

不是一個答案,但建議''頭可能完全不需要任何代碼。 –

回答

5

看來你正試圖部分專門化函數模板,這在C++中實際上是不可能的。你想,而不是什麼是簡單地重載函數是這樣的:

template<typename T> 
T square(T num) // Overload #1 
{ 
    return num * num; 
} 

template<typename T> 
Complex<T> square(Complex<T> num) // Overload #2 
{ 
    T temp_real = num.real_*num.real_ - num.img_*num.img_; 
    T temp_img = 2 * num.img_ * num.real_; 
    return Complex<T>(temp_real, temp_img); 
} 

通俗地說,編譯器將總是挑過載#2在超載#1時的說法是Complex<T>型的,因爲它是一個更好的匹配。


的另一種方法,使這項工作是重載乘法運算符使用the definition of multiplication for complex numbersComplex<>類。這具有更廣泛的優勢,您可以將此想法擴展到其他運營商。

template <typename T> 
class Complex 
{ 
public: 
    T real_; 
    T img_; 

    Complex(T real, T img) : real_(real), img_(img) {} 

    Complex operator*(Complex rhs) // overloaded the multiplication operator 
    { 
     return Complex(real_*rhs.real_ - img_*rhs.img_, 
      img_*rhs.real_ + real_*rhs.img_); 
    } 
}; 

// No overload needed. This will work for numeric types and Complex<>. 
template<typename T> 
T square(T num) 
{ 
    return num * num; 
} 

既然你是新的C++,我強烈建議你拿起a good introductory C++ book。模板和運算符重載並不完全是初學者的主題。