【问题标题】:Template error with dependent names具有依赖名称的模板错误
【发布时间】: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&lt;DIM&gt;::Modetypename”。
  • 请,下次您提出问题时,请发布包含错误的实际源代码,而不是像它或它的某些部分一样。请参阅sscce.org,了解有关如何以及为何发布最小、完整的示例程序的信息。
  • @Caron:确实,当您了解它时,这似乎很清楚。但是,当您从未收到过这样的警告,也从未见过必须使用 typename 关键字声明类型名的代码时(我的意思是,模板内部除外),这听起来像是所有奇怪的警告,毫无意义......: /@Rob:好的。

标签: c++ templates


【解决方案1】:

我相信您的代码有两个问题。第一个在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&lt;DIM&gt; 内的类型的名称。

同样,在后面的代码中,代码

template<int DIM>
void myClass2<DIM>::myfunc(myClass<DIM>::Mode m)
{
}

应该阅读

template<int DIM>
void myClass2<DIM>::myfunc(typename myClass<DIM>::Mode m)
{
}

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

希望这会有所帮助!

【讨论】:

  • 是的!谢谢大家,我错过了类型名!我不知道我们必须添加它,因为 Mode 显然是一种类型......!第一个问题只是一个错字 :p 谢谢,现在可以了 :) (验证还剩 4 分钟)
【解决方案2】:

给你...

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-13
    • 2021-10-18
    • 2016-04-06
    • 1970-01-01
    • 2014-11-10
    • 2011-03-19
    • 1970-01-01
    • 2013-03-03
    相关资源
    最近更新 更多