在下面的代码中,如果删除模板,我会收到编译错误:
template<int DIM> class myClass
{
public :
enum Mode {aa,bb};
myClass(){};
};
template<int DIM> class myClass2
{
myClass2(){};
void myfunc(myClass::Mode m);
};
template<int DIM>
void myClass2<DIM>::myfunc(myClass<DIM>::Mode m)
{
}
test.cpp(19):警告C4346:'myClass :: Mode':从属名称不是类型
之前缺少')'
带有'typename'的前缀表示类型
test.cpp(19):错误C2146:语法错误:在标识符'm'
如果删除之类的话:
template<int DIM>
void myClass2<DIM>::myfunc(myClass::Mode m)
我明白了:
test.cpp(19):错误C2955:'myClass':使用类模板需要模板参数列表
如果我将myfunc
的定义直接放在类的声明中(我想避免),它就可以了。
我该怎么办?为什么会这样?
由于
答案 0 :(得分:6)
我相信您的代码中存在两个问题。第一个是myClass2
中的声明:
void myfunc(myClass::Mode m);
由于myClass
是模板,因此您需要指定模板参数。我假设你可能打算写
void myfunc(myClass<DIM>::Mode m);
但是,由于C ++中的奇怪特性,你可以将其写为
void myfunc(typename myClass<DIM>::Mode m);
这里的typename
关键字告诉C ++ Mode
是嵌套在类myClass<DIM>
内的类型的名称。
同样,稍后在代码中,代码
template<int DIM>
void myClass2<DIM>::myfunc(myClass<DIM>::Mode m)
{
}
应该阅读
template<int DIM>
void myClass2<DIM>::myfunc(typename myClass<DIM>::Mode m)
{
}
告诉编译器Mode
是类型的名称。
希望这有帮助!
答案 1 :(得分:1)
你去......
template<int DIM> class myClass
{
public :
enum Mode {aa,bb};
myClass(){};
};
template<int DIM> class myClass2
{
myClass2(){};
// you need to pass the template parameter to myClass
// "typename" needs to be present when using types from templated classes
// from within a templated class/function.
void myfunc(typename myClass<DIM>::Mode m);
};
template<int DIM>
void myClass2<DIM>::myfunc(typename myClass<DIM>::Mode m)
{
}