失踪 ';'在标识符错误/类问题之前
Posted
技术标签:
【中文标题】失踪 \';\'在标识符错误/类问题之前【英文标题】:missing ';' before identifier error / trouble with classes失踪 ';'在标识符错误/类问题之前 【发布时间】:2014-04-14 17:56:06 【问题描述】:您好,我正在学习 c++ 和课程。出于某种原因,如果我将其注释掉其他所有运行,我就无法运行此特定功能。编辑:* 我意识到我没有显示正确的信息,但问题不是案例陈述,因为即使删除的问题仍然存在。我为 card.h 添加了整个代码
在card.h中
#ifndef _CARD_
#define _CARD_
#include <string>
class Card
private:
int suit;
int rank;
public:
// Default Constructor
Card();
void genRandom();
string getRank();
string getSuit();
void printCard();
bool sameCard(Card);
bool sameSuit(Card);
bool sameRank(Card);
;
#endif
在card.cpp中
string Card::getRank()
cout << "test";
我遇到了类似的错误
Card::getRank' : 重新定义;不同的基本类型
和
card.h(17):错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持 default-int
card.h(17): 错误 C2146: 语法错误: 缺少';'在标识符“getRank”之前
【问题讨论】:
同样在default
,你应该返回一个字符串或在那里做一些事情。
'10'
绝对不是你想要的。它是一个具有实现定义值的多字符常量。你可能想要10
,而不是'10'
。如果您的编译器没有警告您,我会感到惊讶。
错误信息引用了getSuit
,但您没有向我们展示任何定义、声明或引用getSuit
的代码。问题在于您没有向我们展示的一些代码。
在案例 13 之后您缺少 break
。
您对问题的编辑过多......回复不符合您问题的最新形式
【参考方案1】:
case
-s 后面应该跟数字:
case 9: return "Nine";
case 10: return "Ten";
在return
之后不需要break
!
你应该提供一个默认的语句:
default: return "??";
顺便说一句:case '1'
取决于字符编码。在我的 UTF-8 Linux 机器上,字符 1
(在 C 或 C++ 代码中记为 '1'
)是(编码为)数字 49
【讨论】:
或者,(int)'1'
,取决于输入
但是字符和多字符的litterals 是数字。【参考方案2】:
你责备错了。错误C4430: missing type specifier - int assumed.
是关键部分;随后的错误是编译器试图理解已经不正确的代码。始终从 top 而不是 bottom 读取错误消息;尤其是当它们引用相同或相邻的行时,并按此顺序修复它们。
字符串类在std::
命名空间中:
std::string getRank();
std::string getSuit();
std::string Card::getRank()
std::cout << "test";
在您的情况下,string
不是类型,并且后面没有 ()
,因此编译器(看起来像 VC++)假定它是一个数据成员,然后抱怨它没有类型,并且它是后面没有;
,这是前面假设所必需的。编译器还告诉您错误出现在第 17 行 - 所以无论哪种方式,您都知道这是错误的行(尽管并不总是那么直截了当 - 这是编译器至少停止理解您的代码的行)。
帮助解释错误消息的另一种方法是使用多个编译器 - 来自第二个编译器的不同诊断通常可以提供信息。例如 GCC 报告 card.h:17:9: error: ‘string’ does not name a type
- 给出错误标记的行号和列号 (9)。
【讨论】:
哦,非常感谢,就是这样。我总是很难理解编译器错误,因为它们看起来很模棱两可(而且我很烂)哈哈 @user2063087 :我已经添加了关于错误解释的进一步建议以回答。【参考方案3】:更新:对于您的最新更新,编译器无法识别string
。您应该使用适当的命名空间,即std::
:
std::string getRank();
std::string getSuit();
...
std::string Card::getRank()
...
注意:以下是旧版 OP 的问题。
对于第一个错误,您不能仅根据函数的返回值重载函数。
string Card::getSuit(void);
int Card::getSuit(void);
C++11 §13.1 可重载声明
某些函数声明不能重载:
——仅返回类型不同的函数声明不能重载。
——如果其中任何一个是静态成员函数声明 (9.4),则不能重载具有相同名称和相同参数类型列表的成员函数声明。
——[...]
对于第二个错误,您应该完成default
语句:
default: return "";
P.S.: '10'
-'13'
是多字符文字,由实现定义。
C++11 §2.14.3 字符文字
字符文字是用单引号括起来的一个或多个字符,如
’x’
,前面可选字母L
,如L’x’
。不以L
开头的字符文字是普通字符文字,也称为窄字符文字。包含单个 c-char 的普通字符文字具有 char 类型,其值等于执行字符集中 c-char 编码的数值。 包含多个 c-char 的普通字符文字是多字符文字。多字符文字具有int
类型和实现定义的值。
【讨论】:
【参考方案4】:您必须在标签default:
之后的右大括号前放置一个分号
default: // <==here must be a semicolon
应该有
default: ;
或者干脆去掉这个标签。如果使用了标签,那么应该有一个 return 语句,因为该函数的返回类型不是void
。
还有这些情况
case '10': return "Ten"; break;
case '11': return "Eleven"; break;
case '12': return "Twelve"; break;
case '13': return "Thirteen";
是实现定义的,因为包含超过 1 个字符的字符文字是实现定义的。我认为这个行为不像你想的那样。
根据 C++ 标准
包含多个 c-char 的普通字符文字是 多字符文字。多字符文字,或普通 包含单个 c-char 的字符文字在 执行字符集,有条件支持,具有 int 类型,并且 具有实现定义的值。
至于与函数getSuit
相关的其他错误,那么函数声明在两个地方不同(我认为在定义类定义时在类定义内部和类定义外部)。
【讨论】:
以上是关于失踪 ';'在标识符错误/类问题之前的主要内容,如果未能解决你的问题,请参考以下文章
错误 C2146:语法错误:缺少“;”在标识符“ContextRecord”之前
语法错误:缺少 ';'编译 winnt.h 时在标识符“PVOID64”之前
错误 C2146:语法错误:缺少“;”在标识符 'm_ball' C++、MFC 之前