使用(非类型)枚举参数定义内部类成员函数模板
Defining an Inner class member function template with a (non type) enum argument
我很难定义和专门化内部类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
。
相关文章:
- 在设计 SDK 时,我是否应该在 C++ 头文件中完全隐藏内部类?
- 如何声明由多个线程调用的 C++ DLL 的内部类,而无需导出类
- 从内部类继承
- 如何将枚举类转发声明为模板化类的内部类?
- 从内部类中的方法从包含类调用方法
- 从模板化父类中的派生内部类访问受保护的成员变量
- C++模板类的内部类访问
- 可视化C++外部定义内联函数
- 使用类模板的内部类模板专用化模板
- 参数化类的别名(或类型定义)内部类
- 如何在外部类中使用类模板时定义内部类构造函数
- 为什么内部类*定义*不能使用其父类?
- C++ 定义内部类的<<运算符
- 外部类的嵌套类定义,而外部类包含内部类的实例
- 在命名空间中,如何定义从内部类返回对象的函数
- 如何在不把内部类的定义放入父类的情况下创建一个内部类
- 扩展非类型形参包来定义带有非类型形参的内部类模板是否合法?
- 模板类外部的内部类方法定义
- 使用(非类型)枚举参数定义内部类成员函数模板
- 如何在派生类中定义内部类成员