具有从属名称的模板错误

nbo*_*eel 2 c++ templates

在下面的代码中,我得到一个编译错误,如果我删除模板,我没有:

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)
{
}
Run Code Online (Sandbox Code Playgroud)

test.cpp(19):警告C4346:'myClass :: Mode':依赖名称不是
带有'typename' 的类型前缀,表示类型
test.cpp(19):错误C2146:语法错误:缺少')'之前标识符'm'

如果我删除之类:

template<int DIM>
void myClass2<DIM>::myfunc(myClass::Mode m)
Run Code Online (Sandbox Code Playgroud)

我明白了:

test.cpp(19):错误C2955:'myClass':使用类模板需要模板参数列表

如果我把定义myfunc直接放在类的声明中(我想避免),它就可以了.

我该怎么办?为什么会这样?

谢谢

tem*_*def 6

我相信你的代码中有两个问题.第一个是在本声明中myClass2:

void myfunc(myClass::Mode m);
Run Code Online (Sandbox Code Playgroud)

因为myClass是模板,您需要指定模板参数是什么.我假设你可能想写

void myfunc(myClass<DIM>::Mode m);
Run Code Online (Sandbox Code Playgroud)

但是,由于C++中的奇怪特性,你可以将其写成

void myfunc(typename myClass<DIM>::Mode m);
Run Code Online (Sandbox Code Playgroud)

typename这里的关键字告诉C++这Mode是嵌套在类中的类型的名称myClass<DIM>.

同样,稍后在代码中,代码

template<int DIM>
void myClass2<DIM>::myfunc(myClass<DIM>::Mode m)
{
}
Run Code Online (Sandbox Code Playgroud)

应该读

template<int DIM>
void myClass2<DIM>::myfunc(typename myClass<DIM>::Mode m)
{
}
Run Code Online (Sandbox Code Playgroud)

告诉编译器这Mode是一个类型的名称.

希望这可以帮助!