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<Type>* temp = new Node(Type _data)
编译器告诉我““节点”之前的预期类型说明符
有什么想法吗?谢谢!
编辑:更改了这部分
Node<Type>* temp = new Node(Type _data)
到 Node<Type>* temp = new Node(_data)
但没有解决问题
【问题讨论】:
Node<Type>* temp = new Node<Type>(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:错误:“”令牌之前的预期类名