2011-07-12 12 views
3

私はC++を使い慣れていないので、テンプレートを使用しようとしていますが問題があります。 私がしようとしているのは、テンプレートを使って数値の2乗を計算しようとします。数値は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++では不可能です。あなたが代わりに欲しいのは、単にこのような関数をオーバーロードすることです。それは、より良い試合だから、引数の型Complex<T>であるとき

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); 
} 

は非公式に、コンパイラは常に過負荷#1の上に過負荷#2を選択します。


この作品を作るための別の方法はthe definition of multiplication for complex numbersを使用してComplex<>クラスの乗算演算子をオーバーロードすることです。これはより一般的であるという利点があり、この考え方を他の演算子に拡張することができます。

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を拾うことをお勧めします。テンプレートと演算子のオーバーロードは、初心者のトピックではありません。

関連する問題