具有从属名称的模板错误

时间:2011-06-30 18:56:23

标签: 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)
{
}
  

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的定义直接放在类的声明中(我想避免),它就可以了。

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

由于

2 个答案:

答案 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)
{
}