使用(非类型)枚举参数定义内部类成员函数模板

Defining an Inner class member function template with a (non type) enum argument

本文关键字:定义 内部类 成员 函数模板 参数 枚举 类型 使用      更新时间:2023-10-16

我很难定义和专门化内部类Outer<T1>::Inner的成员函数update(),该函数是在非类型(enum)参数上模板化的。

#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不同,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
{
};

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

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