标识符错误/类问题之前缺少';'

missing ';' before identifier error / trouble with classes

本文关键字:错误 问题 标识符      更新时间:2023-10-16

嗨,我正在学习c++和类。由于某些原因,我无法运行这个特定的函数,如果我注释掉它,其他的一切都会运行。编辑:*我意识到我没有显示正确的信息,但问题不是案例陈述,因为即使删除了问题仍然存在。我添加了卡的整个代码。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"; 
}

我收到了类似的错误

卡::getRank':重新定义;不同的基本类型

card.h(17):错误C4430:缺少类型说明符-假定为int。注意:C++不支持默认的int

card.h(17):错误C2146:语法错误:缺少";"在标识符"getRank"之前

case-s后面应该跟数字:

case 9: return "Nine";
case 10: return "Ten";

return之后不需要break

并且您应该提供一个默认的语句:

default: return "??";

BTW:case '1'取决于字符编码。在我的UTF-8 Linux机器上,字符1(在C或C++代码中记为'1')(编码为)数字49

你指责的是错误的事情。误差C4430: missing type specifier - int assumed.是关键部分;随后的错误是编译器试图理解已经不正确的代码。始终从顶部而不是底部读取错误消息;尤其是当它们指的是相同或相邻的线,并按该顺序固定它们时。

字符串类位于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)。

已更新:对于您的最新更新,编译器无法识别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和实现定义的值

必须在标签default: 后的右大括号前放置分号

default:  // <==here must be a semicolon
}

必须有

default: ;
}

或者干脆去掉这个标签。如果使用了标签,那么应该有一个返回语句,因为函数的返回类型不是void

还有这些情况

case '10': return "Ten"; break;
case '11': return "Eleven"; break;
case '12': return "Twelve"; break;
case '13': return "Thirteen";

是实现定义的,因为包含1个以上字符的字符文字是实现定义。我认为这个行为并不像你想的那样。

根据C++标准

包含多个c-char的普通字符文字是多字符文字。多字符文字或普通文字包含在执行字符集,有条件支持,具有int类型,并且具有实现定义的值

至于相对于函数getSuit的其他错误,那么函数声明在两个地方不同(我认为在类定义内部和定义时在类定义外部)。