6

非型(列挙型)引数でテンプレート化されたupdate()内部クラスのメンバー関数を定義して特殊化するのに苦労しています。Outer<T1>::Inner

#include <cstdlib>

template<typename T1>
struct Outer
{
    struct Inner
    {
        enum Type{ A , B , C };

        template<Type T2>
        void update();
    };
};

// Definition
template<typename T1>
template<Outer<T1>::Inner::Type T2>
void Outer<T1>::Inner::update()
{
}

// Specialization
template<typename T1>
template<Outer<T1>::Inner::A >
void Outer<T1>::Inner::update()
{
}

int main()
{
    return EXIT_SUCCESS;
}

GCC4.5.3で次のエラーメッセージが表示されます

prog.cpp:17:28: error: ‘Outer::Inner::Type’ is not a type
prog.cpp:18:6: error: prototype for ‘void Outer<T1>::Inner::update()’ does not match any in class ‘Outer<T1>::Inner’
prog.cpp:11:15: error: candidate is: template<class T1> template<Outer<T1>::Inner::Type T2> void Outer<T1>::Inner::update()
prog.cpp:24:28: error: ‘Outer::Inner::A’ is not a type
prog.cpp:25:6: error: prototype for ‘void Outer<T1>::Inner::update()’ does not match any in class ‘Outer<T1>::Inner’
prog.cpp:11:15: error: candidate is: template<class T1> template<Outer<T1>::Inner::Type T2> void Outer<T1>::Inner::update()

ところで、GCCとは異なり、VisualStudio2008は以下をコンパイルできません

template<typename T1>
struct Outer
{
    struct Inner
    {
        enum Type{ A , B , C };

        template<Type T2>
        struct Deep;
    };
};

template<typename T1>
template<typename Outer<T1>::Inner::Type T2>
struct Outer<T1>::Inner::Deep
{
};
4

1 に答える 1

5

まず第一に、あなたはtypename前を逃していますOuter<T1>::Inner::Type。は依存型であるtemplateため、型リストでもそれを持っている必要があります。Type

第二に、特殊化の構文が間違っています(型は<>、関数名の後に括弧の前にあり、ではありませんtemplate<>)が、それが正しい場合でも、正当ではありません。明示的なテンプレートの特殊化に関する不幸なルールに従って、Outer完全に特殊化する前に、外側のテンプレートを特殊化する必要があります。update

于 2013-02-08T16:18:35.113 に答える