【问题标题】:C++ error: expected type specifier before "class name" [duplicate]C ++错误:“类名”之前的预期类型说明符[重复]
【发布时间】:2019-12-05 00:48:50
【问题描述】:

我不确定为什么会出现此错误?我确实为我的节点和我的班级指定了类型。

不太清楚发生了什么。对于 StackLL 和 Node 类,我都指定了 .

.h 文件

using namespace std;




template<class Type>
class Node {

    public:
        Node(Type _data);
        Type data;
        Node* next;


};


template <class Type>
class StackLL {

    public:

        StackLL(); //constructor
        ~StackLL();

        void pop();
        void push(Type _data);
        int size();
        bool empty();

        int lSize;
        Node<Type>* top;


};

.cpp 文件


#include<iostream>
#include "stack.h"

using namespace std;



template <class Type>
Node<Type>::Node(Type _data) {

    data = _data;
    next = NULL;

};



template <class Type>
StackLL<Type>::StackLL() {

    lSize = 0;
    top = NULL;
};


template <class Type>
StackLL<Type>::~StackLL() {

    delete top;

};


template <class Type>
void StackLL<Type>::push(Type _data) {

    Node<Type>* temp = new Node(_data)

    lSize++;

    if (top == NULL) {
        top = temp;
    } else {
        temp->next = top;
        top = temp;
    };

};


template <class Type>
void StackLL<Type>::pop() {

    if (top == NULL) {

        cout << "Empty";

    } else {

        Node<Type>* temp = top;

        top = top->next;

        temp->next = NULL;

        free(temp);

        lSize--;

    };

};


template <class Type>
int StackLL<Type>::size() {

    return lSize;

};



template <class Type>
bool StackLL<Type>::empty() {

    if (lSize == 0) {
        return true;
    } else {
        return false;
    };
};


我的 stackLL push 函数发生错误,这里:

template <class Type>
void StackLL<Type>::push(Type _data) {

    Node<Type>* temp = new Node(Type _data)

    lSize++;

    if (top == NULL) {
        top = temp;
    } else {
        temp->next = top;
        top = temp;
    };

};

对于这一行:Node&lt;Type&gt;* temp = new Node(Type _data) 编译器告诉我““节点”之前的预期类型说明符

有什么想法吗?谢谢!

编辑:更改了这部分

Node&lt;Type&gt;* temp = new Node(Type _data)Node&lt;Type&gt;* temp = new Node(_data) 但没有解决问题

【问题讨论】:

  • Node&lt;Type&gt;* temp = new Node&lt;Type&gt;(Type _data) 工作吗?
  • @ProxicT,哇,我觉得自己很愚蠢。非常感谢。是的,它有效......我什至在stackoverflow上搜索了这个,对于其他人来说,似乎他们在使用new时没有这样做。另外,我之前尝试过,但它失败的原因是因为在我的输入参数中我有 Type _data 而它应该只是 _data。非常感谢!
  • 你不必觉得自己很愚蠢,这些愚蠢的错误都会发生在我们所有人身上:-)

标签: c++ class templates


【解决方案1】:

问题是您只指定了指针类型的类型,但忘记在实际创建实例的右侧指定它。

要修复它,请指定创建实例的Node 的类型:

Node<Type>* temp = new Node<Type>(_data);

【讨论】:

    【解决方案2】:

    Node 是模板类型,但它不是StackLL 模板类的嵌套类型,因此无法在StackLL 的方法体中自动推导出Node 的Type 参数。每当您引用 Node 类时,都需要显式包含 Type 参数。您在 temp 变量的声明中这样做,而不是在 new 语句中。

    另外,在将_data 传递给Node 构造函数时,您在参数列表中指定了Type。不要那样做。您在声明变量和参数时指定类型,而不是在为它们赋值时指定类型。

    IOW,你需要改变这一行:

    Node<Type>* temp = new Node(Type _data);
    

    改为:

    Node<Type>* temp = new Node<Type>(_data);
    

    单独说明:

    正如您所演示的那样,您最终会在尝试将模板化类分成.h.cpp 文件时遇到问题。详情请见Why can templates only be implemented in the header file?

    此外,您的 .h 文件似乎缺少任何类型的标头保护,以防止其声明在同一翻译文件 (.cpp) 中多次出现 #include,例如:

    #ifndef StackH
    #define StackH
    
    // Node and StackLL declarations here...
    
    #endif
    

    或者

    #pragma once
    
    // Node and StackLL declarations here...
    

    取决于您使用的编译器。

    【讨论】:

      猜你喜欢
      • 2012-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多