C ++错误:“类名”之前的预期类型说明符[重复]

Posted

技术标签:

【中文标题】C ++错误:“类名”之前的预期类型说明符[重复]【英文标题】:C++ error: expected type specifier before "class name" [duplicate] 【发布时间】: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,哇,我觉得自己很愚蠢。非常感谢。是的,它有效......我什至在***上搜索了这个,对于其他人来说,似乎他们在使用new时没有这样做。另外,我之前尝试过,但它失败的原因是因为在我的输入参数中我有 Type _data 而它应该只是 _data。非常感谢! 你不必觉得自己很愚蠢,这些愚蠢的错误都会发生在我们所有人身上:-) 【参考方案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...

取决于您使用的编译器。

【讨论】:

以上是关于C ++错误:“类名”之前的预期类型说明符[重复]的主要内容,如果未能解决你的问题,请参考以下文章

对象之前的预期')'。类没有命名类型[重复]

C++ 错误:'(' 标记之前的预期构造函数、析构函数或类型转换

src/walletdb.h:96:1:错误:“”令牌之前的预期类名

c++ 错误:预期构造函数、析构函数或在“(”标记之前的类型转换

错误:“;”之前的预期构造函数、析构函数或类型转换令牌

“”之前的预期类名