【问题标题】:template and derived class definition : error: 'myClass' is not a class, namespace, or enumeration模板和派生类定义:错误:“myClass”不是类、命名空间或枚举
【发布时间】:2016-04-20 14:08:14
【问题描述】:

我正在尝试学习 C++ 中的模板,我有以下代码:

#include <stack>

template<typename T>
class   myClass : public std::stack<T>{
public:
    myClass(void);
    myClass(myClass const & src);
    virtual ~myClass(void);
    myClass &   operator=(myClass const & rhs);
};

template<typename T>
myClass::myClass(void) : std::stack<T>(){
}

但我无法弄清楚为什么我在尝试编译时会得到以下信息:

test.cpp:17:1: error: 'myClass' is not a class, namespace, or enumeration
myClass::myClass(void) : std::stack<T>(){
^
test.cpp:8:9: note: 'myClass' declared here
class   myClass : public std::stack<T>{
        ^
1 error generated.

看起来函数的定义会导致错误,但我不知道为什么会出现此错误,对我来说看起来不错(即使我猜它不是真的不错),也许只是语法错误? .

我用clang++ -Wall -Werror -Wextra -c编译。

什么可能导致这个错误?

【问题讨论】:

  • 旁注:如果函数没有参数,则不需要指定void,只需使用myClass();即可。
  • @user657267 确实如此,但出于编程风格的原因,我必须在学校使用它(我的学校问,我养成了这个习惯)。

标签: c++ templates derived-class


【解决方案1】:

您需要为其指定模板参数,因为myClass 是一个类模板。

template<typename T>
myClass<T>::myClass(void) : std::stack<T>() {
//     ^^^
}

LIVE


顺便说一句:: std::stack&lt;T&gt;() 似乎是多余的。

【讨论】:

  • 就是这样!非常感谢,这也许是一个愚蠢的问题,我的错!那是因为编译器需要此参数需要在定义其成员函数之前“实例化”该类吗? (虽然我可能错了,我只是想了解这样做的目的)
  • @vmonteco 我不这么认为。我认为编译器只是认为myClass 后面应该跟&lt;&gt;,因为它是一个模板。所以换一种说法,编译器找不到名为myClass的非模板类。
  • @songyuanyo 我刚刚发现如果我将它作为参数传递它也是必需的,所以我猜它是作为类型定义的类定义的一部分? (也许它类似于 myClass -> 模板和 myClass -> 使用模板创建的类?),(顺便说一句,“std::”是什么意思? stack()" 是多余的,在这种情况下我可以不用吗?
  • @vmonteco 是的,它是课程的一部分。 : std::stack&lt;T&gt;() 是多余的,因为如果您不指定 anthing,则默认构造基类。如果您希望专门构建基类,这将很有用,sush 为: std::stack&lt;T&gt;(std::vector&lt;T&gt;())
  • 有道理,我明白了。谢谢你的解释!
猜你喜欢
  • 2016-06-22
  • 1970-01-01
  • 2014-07-24
  • 2016-03-27
  • 2011-07-08
  • 1970-01-01
  • 2014-04-09
  • 1970-01-01
相关资源
最近更新 更多