Olu*_*ide 6 c++ templates inner-classes specialization non-type
我很难定义和专门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;
}
Run Code Online (Sandbox Code Playgroud)
我在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()
Run Code Online (Sandbox Code Playgroud)
BTW,与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
{
};
Run Code Online (Sandbox Code Playgroud)
首先,你错过了typename
之前Outer<T1>::Inner::Type
.你必须拥有它,即使是在template
类型列表中,因为它Type
是一个依赖类型.
其次,你的专业化语法是错误的(类型在<>
括号之前的函数名称之后,而不是在括号中template<>
),但即使它是正确的,也不合法.根据关于显式模板特化的不幸规则,您必须Outer
在完全专门化之前专门化外部模板update
.
归档时间: |
|
查看次数: |
1341 次 |
最近记录: |