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

これは可能ですか?

4

2 に答える 2

1

Tを離れて、関数テンプレートのみを特殊化する場合、Tはまだテンプレート化されており、関数で使用できるため、実行しようとしていることは部分特殊化と呼ばれます。ただし、残念ながら、関数の部分的なテンプレートの特殊化(メンバー関数であろうと非メンバー関数であろうと)は許可されていません。したがって、コードでコンパイルエラーが発生します。

クラステンプレートも専門化して完全に専門化するか、まったく専門化しないかのどちらかです。

于 2010-12-04T10:03:01.363 に答える
1

C++03 [$14.7.3/18] は言う

クラス テンプレートのメンバーまたは名前空間スコープに表示されるメンバー テンプレートの明示的な特殊化宣言では、メンバー テンプレートとその外側のクラス テンプレートの一部は、特殊化されていないままになる場合があります。囲んでいるクラス テンプレートも明示的に特殊化されていません

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

このようなものがうまくいくでしょう。

template <>
template <>
void MyClass<E_1>::myMethod<int>(int value)
{
    std::cout << value << '\n';
}
于 2010-12-04T09:49:43.330 に答える