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

时间:2014-04-14 17:56:07

标签: c++ string class

我正在学习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"; 

}

我收到错误

  

卡:: getRank&#39; :重新定义;不同的基本类型

  

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

     

card.h(17):错误C2146:语法错误:缺少&#39 ;;&#39;在标识符&#39; getRank&#39;

之前

4 个答案:

答案 0 :(得分:4)

case - s之后应加上数字:

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

break之后无需return

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

default: return "??";

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

答案 1 :(得分:3)

你指责错误的事情。错误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)。

答案 2 :(得分:2)

已更新:对于您的最新更新,编译器无法识别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),则不能重载具有相同名称和相同parameter-type-list的成员函数声明。

     

- [...]


对于第二个错误,您应该完成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和实现定义的值。

答案 3 :(得分:1)

您必须在标签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的普通字符文字是a   多字形文字。多字符文字,或普通文字   包含单个c-char的字符文字在...中不可表示   执行字符集,有条件支持,有类型int,和   具有实现定义的值

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