2010-12-04 7 views
2

このテーマはかなり古いものになるはずですが、この特定のケースでは苦労しています。クラステンプレートからメソッドテンプレートを完全に特殊化する

enum MyEnum 
{ 
    E_1, 
    E_2 
}; 

template <MyEnum T> 
class MyClass 
{ 
    // method to be fully specialized 
    template <typename U> 
    void myMethod(U value); 
}; 

// full specialization of method template from class template 
// (or is this in fact partial, since I'm leaving T alone?) 
template <MyEnum T> 
template <> 
void MyClass<T>::myMethod<int>(int value) 
{ 
    std::cout << value << '\n'; 
} 

これが可能である:ストレートポイントに

が、これは私が何をしたいのですか?

答えて

1

C++ 03 [$ 14.7.3/18]クラステンプレートまたは名前空間スコープに表示されるメンバーテンプレートのメンバーのための明示的な特化宣言、メンバテンプレートとのいくつかでは

を語ります囲みクラステンプレートが明示的に特殊化されていない場合でも、宣言で明示的にクラスメンバテンプレートを特化してはならないことを除いて、その囲むクラステンプレートはのままであることがあります。

したがって、囲みクラスも特殊化する必要があります。

このようなものが動作します。

template <> 
template <> 
void MyClass<E_1>::myMethod<int>(int value) 
{ 
    std::cout << value << '\n'; 
} 
+3

私はちょうどあなたの答えによって啓発されました。私はいつも「あなたが囲んでいるクラスを専門にしなければならない」ということに気付くのは恥ずかしいです。クラス全体を実際に再宣言しなければならないと思っていましたが、それは専門化されたメソッドを複製する必要があるということです。 ?それはちょっと退屈だけど、思ったよりはるかに良い! –

1

のみ関数テンプレートを専門としているときに、Tを残すので、Tは、まだテンプレートであり、あなたはあなたの関数でそれを使用することができますので、あなたが何をしようとして、部分的な特殊化と呼ばれます。しかし残念なことに、関数の部分的なテンプレートの特殊化(メンバー関数であろうと非メンバ関数であろうと)はではなく、が許されます。したがって、あなたのコードはコンパイルエラーを起こすでしょう。

クラステンプレートを特化して完全に専門化するか、まったく指定しないでください。

+0

はい、今は意味があります。私は、「クラス全体を専門化しなければならない」という人の話を聞いたときに、クラス全体を書き直すという考えのまわりに頭を浮かべることはありませんでした。それは、今日の私は彼らがテンプレート<>テンプレート<>を参照して実現した...どのようなシャアメ〜 –

関連する問題