失踪 ';'在标识符错误/类问题之前

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”之前

我不明白的 C++ 错误:语法缺失 ';'在标识符之前

语法错误:缺少 ';'编译 winnt.h 时在标识符“PVOID64”之前

错误 C2146:语法错误:缺少“;”在标识符 'm_ball' C++、MFC 之前

错误:C2146:语法错误:缺少“;”在标识符“m_Employer”之前,

用户创建的类对象实例化的未声明标识符