【发布时间】:2011-06-30 18:56:22
【问题描述】:
在以下代码中,如果我删除模板,我会得到一个编译错误:
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) : error C2955: 'myClass' : 使用类模板需要模板参数列表
如果我将myfunc 的定义直接放在类的声明中(我想避免这样做),它会起作用。
我应该怎么做?为什么会这样?
谢谢
【问题讨论】:
-
在我看来警告相当清楚:“前缀
myClass<DIM>::Mode和typename”。 -
请,下次您提出问题时,请发布包含错误的实际源代码,而不是像它或它的某些部分一样。请参阅sscce.org,了解有关如何以及为何发布最小、完整的示例程序的信息。
-
@Caron:确实,当您了解它时,这似乎很清楚。但是,当您从未收到过这样的警告,也从未见过必须使用 typename 关键字声明类型名的代码时(我的意思是,模板内部除外),这听起来像是所有奇怪的警告,毫无意义......: /@Rob:好的。