模板和派生类定义:错误:';myClass';不是类、命名空间或枚举 我试图在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>(){ } #包括 模板 类myClass:public std::stack{ 公众: myClass(无效); myClass(myClass const&src); 虚拟~myClass(void); myClass和运算符=(myClass常量和rhs); }; 模板 myClass::myClass(void):std::stack(){ }

模板和派生类定义:错误:';myClass';不是类、命名空间或枚举 我试图在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>(){ } #包括 模板 类myClass:public std::stack{ 公众: myClass(无效); myClass(myClass const&src); 虚拟~myClass(void); myClass和运算符=(myClass常量和rhs); }; 模板 myClass::myClass(void):std::stack(){ },c++,templates,derived-class,C++,Templates,Derived Class,但我不明白为什么我在尝试编译时会得到以下结果: 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

但我不明白为什么我在尝试编译时会得到以下结果:

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.
test.cpp:17:1:错误:“myClass”不是类、命名空间或枚举
myClass::myClass(void):std::stack(){
^
test.cpp:8:9:注意:这里声明了“myClass”
类myClass:public std::stack{
^
生成1个错误。
看起来函数的定义导致了这个错误,但我不知道为什么会出现这个错误,在我看来它是正常的(即使我猜它不是真的正常),可能只是语法错误

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


什么可能导致此错误?

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

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



顺便说一句:
:std::stack()
似乎是多余的。

旁注:如果一个函数没有参数,你不需要指定
void
,只要使用
myClass();
@user657267确实如此,但出于编程风格的原因,我不得不在学校使用它(学校要求,我养成了这个习惯)。就是这样!非常感谢,这可能是一个愚蠢的问题,我的错!是因为编译器需要这个参数吗?需要在定义类的成员函数之前“实例化”类吗?(我可能错了,我只是想理解这个问题的目的)@vmonteco我不这么认为。我认为编译器只是认为
myClass
后面应该跟
,因为它是一个模板。所以换言之,编译器找不到名为
myClass
@songyuanyo的非模板类。我刚刚发现,如果我将它作为参数传递,它也是必需的,所以我猜它是类的一部分类型定义?(可能类似于myClass->template和myClass->用模板创建的类?)是多余的,因为如果您不指定anthing,基类将默认构造。如果您希望基类专门构造,这将非常有用,因为
:std::stack(std::vector())
。这很有意义,我明白了。感谢您的解释!