[英]Defining an Inner class member function template with a (non type) enum argument
I'm having difficulty defining and specializing a member function update()
of an inner class Outer<T1>::Inner
that is templated on a non-type (enum) argument. 我很难定义和专门化一个内部类
Outer<T1>::Inner
的成员函数update()
,它是在非类型(枚举)参数上模板化的。
#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;
}
I'm getting the following error message in GCC 4.5.3 我在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()
BTW, unlike GCC, Visual Studio 2008 is unable to compile the following 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
{
};
First of all, you're missing a typename
before Outer<T1>::Inner::Type
. 首先,你在
Outer<T1>::Inner::Type
之前缺少一个typename
。 You have to have it, even in a template
type list, because Type
is a dependent type. 您必须拥有它,即使在
template
类型列表中也是如此,因为Type
是依赖类型。
Secondly, your specialisation syntax is wrong (the type goes in <>
after the function name before the parentheses, not in the template<>
), but even if it was correct, it would not be legal. 其次,你的专业化语法是错误的(类型在括号前的函数名之后的
<>
中,而不是在template<>
),但即使它是正确的,也不合法。 You have to specialise the outer template Outer
before you can fully specialise update
, according to an unfortunate rule regarding explicit template specialisation. 根据关于显式模板特化的不幸规则,您必须在完全专门化
update
之前专门化外部模板Outer
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.