标识符错误/类问题之前缺少';'
missing ';' before identifier error / trouble with classes
嗨,我正在学习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
的其他错误,那么函数声明在两个地方不同(我认为在类定义内部和定义时在类定义外部)。
- 警告处理为错误这里有什么问题
- Project Euler问题4的错误解决方案
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 类C++中的函数问题(LNK2019和LNK1120错误)
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- 将鼠标悬停在问题上时与预期">"相关的代码错误
- posix_spawn():使用posix_scawn()时的错误处理问题
- 在 C++ 中使用正则表达式错误时出现问题 括号表达式中的范围无效
- 动态类的分段错误(家庭作业问题)
- C 模板错误问题
- isdigit 的分段错误问题
- 用于防止重复和语法错误问题的布尔数组
- 遇到错误问题:在'{'之前,预期的非限定 id 只是一个我需要的类的标头,只是不确定导致错误的原因
- 对象内部结构:解决分割错误问题
- 与我定义的类的成员有关的c++向量数据类型编译器错误问题
- 警告错误问题
- 使用 C++ 的代码块中的链接器错误问题
- 链接器错误问题
- 分段错误问题 # n
- 如何解决支持库中发生的分段错误问题