2

以下は私にいくつかのコンパイルエラーを与えます:

error C2995: 'void A<T>::B<Q>::func(void)' : function template has already been defined
error C3855: 'A<T>::B<Q>': template parameter 'Q' is incompatible with the declaration

クラス宣言に定義を持たずにこれを行うにはどうすればよいですか?

template<typename T>
struct A
{
    template<typename Q>
    struct B
    {
        void func();
    };
};

template<typename T>
template<typename Q>
void A<T>::B<Q>::func()
{
}

template<typename T>
template<>
void A<T>::B<int>::func()
{
}

編集:

14.7.3 §16 によると、ネストされたクラス テンプレートは、それを囲んでいるクラス テンプレートも特殊化されていない場合、特殊化できません。ただし、次のように外部クラス宣言内で完全に定義されている場合、ネストされたクラスの特殊化が機能するのはなぜでしょうか。

template<typename T>
struct A
{
    template<typename Q>
    struct B
    {
        void func(){}
    };

    template<>
    struct B<int>
    {
        void func(){}
    };  
};

おそらく、これはVS2010だけで、できないはずのことをできるようになっているのでしょうか?

4

1 に答える 1

0

問題は、クラス (または構造体) を使用するときに、テンプレート化された型を宣言できる必要があるという事実にあります。

したがって、テンプレート化されたネストされたクラスがある場合、そのタイプをクラス自体に設定する必要があります。これは、「外部」から行うことができないためです。
例えば:

template<typename T>
struct A
{
    template<typename Q>
    struct B
    {
        void func(){}
    };
};

A<int>さて、型の変数を宣言したいとしましょうB<int>...どのようにしますか?

A<int>::B<int> a; //this syntactically would mean a is of type B<int>
A<int,int> a; //this would mean A is a templated class with 2 templated types

Bしたがって、宣言で実際にアクセスすることはできません。
したがって、Bのタイプはクラス A 内で設定する必要があります。

ネストされたクラス テンプレート

于 2012-04-23T18:51:22.833 に答える