模板和派生类定义: 错误:'myClass'不是一个类、命名空间或枚举。

32

我正在尝试学习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 进行编译。

是什么导致了这个错误?


2
顺便提一下:如果一个函数没有参数,你不需要指定 void,只需使用 myClass(); - user657267
1
@user657267 这是真的,确实如此,但出于编程风格的原因(学校要求,我已经养成了这个习惯),我必须在我的学校中使用它。 - vmonteco
1个回答

49

由于myClass是一个类模板,你需要为它指定模板参数。

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

顺便说一下:: std::stack<T>() 似乎是多余的。


LIVE


就是这样了!非常感谢,也许这是一个愚蠢的问题,我的错!这是因为编译器需要这个参数在定义成员函数之前“实例化”类吗?(虽然我可能错了,我只是试图理解它的目的) - vmonteco
@vmonteco 我不这么认为。我认为编译器只是认为 myClass 应该被 <> 跟随,因为它是一个模板。换句话说,编译器找不到名为 myClass 的非模板类。 - songyuanyao
@songyuanyo,我刚刚发现如果我将它作为参数传递,它也是必需的,所以我猜这是类定义的一部分,作为类型?(也许它类似于myClass -> 模板和myClass<T> -> 使用模板创建的类?)另外,你说“std::stack<T>()”是多余的,这意味着什么?在这种情况下,我可以不用它吗? - vmonteco
1
@vmonteco 是的,它是类的一部分。: std::stack<T>() 是多余的,因为如果您不指定任何内容,基类将默认构造。如果您希望特别构造基类,例如 : std::stack<T>(std::vector<T>()),它将非常有用。 - songyuanyao
我明白了,谢谢你的解释! - vmonteco
以下是相关的阅读材料:类模板参数推断(CTAD)(自C++17开始)。这是C++的又一种烦恼。 :) - Gabriel Staples

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接