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

我在 GCC 4.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 不同,Visual Studio 2008 无法编译以下内容

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

首先,你缺少一个typenamebefore Outer<T1>::Inner::Type。即使在template类型列表中,您也必须拥有它,因为Type它是依赖类型。

其次,您的专业化语法是错误的(类型在<>括号之前的函数名之后,而不是在 中template<>),但即使它是正确的,它也是不合法的。根据关于显式模板专业化的不幸规则,您必须先专业化外部模板Outer,然后才能完全专业化。update

于 2013-02-08T16:18:35.113 回答