2017-02-08 15 views
0

2番目のテンプレートのテンプレートパラメータとして別のテンプレートを継承するテンプレートがあります。 スタティック関数のテンプレートを使用したテンプレートの特殊化

template<class T> class A 
{ 

public: 

    static void foo(); 
}; 

template<class T> class B : public A<B> 
{ 

}; 

は、今私はBとの特殊なクラスの静的関数を実装したいのですが、Bと専門ません:継承されたテンプレートは、静的な関数を定義します。しかし、私はテンプレートを宣言する方法を理解することはできません。私はこれが可能かどうかも分かりません。

template<class T> void A<B<T>>::foo() 
{ 

} 

しかし、これはエラーを与える:私の最初の試みだった

"Nested name specifier 'A<B<T>>::" for declaration does not refer into a class, class template or class template partial specialization" 

私が前に「テンプレート<>」を追加するなどの異なるものを試していないが、働いていたそれらのどれもしました。私はこれをコンパイルすることができる午前:

template<> void A<B<int>>::foo() 
{ 

} 

だけでなく、このよう:

template<class T> void A<T>::foo() 
{ 

} 

これは部分的な特殊化の試みですか?私の最初の印象は「いいえ」です(複数のパラメータを持つテンプレートはありません)。むしろ、私は特殊化されていない別のテンプレートでテンプレートを特化したいと考えています。これは可能ですか?もしそうなら、正しい構文は何ですか?

+0

ありがとう、私はただ修正しました。私は、Bを特殊化するのではなく、Bの特殊化のための静的関数を実装したいと考えています。 – sweatervest

答えて

0

これは実際には部分的な特殊化です。部分的にメソッドを専門化することはできません。クラス全体を部分的に専門化する必要があります。 this answerを参照してください。別のヘルパー構造体にfooを実装し、代わりにその構造体を部分的に特化してみてください。

ここでは、ヘルパー構造体を使用した例を示します。

#include <iostream> 

template<class T> struct t_helper 
{ 
    static void foo() 
    { 
     std::cout << "Not B<T>\n"; 
    } 
}; 

template<class T> class A 
{ 

public: 
    static void foo() { 
     t_helper<T>::foo(); 
    } 
}; 

template<class T> class B {}; 

// Specialize the behavior of A<T>::foo() for all B types 
template<class T> 
struct t_helper<B<T>> 
{ 
    static void foo() 
    { 
     std::cout << "Is B<T>\n"; 
    } 
}; 

int main() 
{ 
    A<int>::foo(); // Prints "Not B<T>\n" 
    A<B<int>>::foo(); // Prints "Is B<T>\n" 
    return 0; 
} 
+0

ありがとう!私は、クラス全体を部分的に専門化するだけで終わった。 – sweatervest

関連する問題