我正在学习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;
之前
答案 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()
{
...
}
对于第一个错误,您不能仅根据返回值重载函数。
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
的其他错误,函数声明在两个地方有所不同(我认为在类定义内部和定义之外的类定义之外)。