c ++预期的左大括号以及重新定义错误
Posted
技术标签:
【中文标题】c ++预期的左大括号以及重新定义错误【英文标题】:c++ expected opening brace as well as redefinition error 【发布时间】:2020-01-05 00:24:44 【问题描述】:所以我试图在 .h 文件中定义我的类并在 cpp 文件中编写构造函数,如下所示:
.h 文件:
class Player : protected Character
public:
Player(sf::Vector2f starting_pos, std::list<Object *> *around) : Character(around);
.cpp 文件:
Player::Player(sf::Vector2f starting_pos, std::list<Object *> *around)
//code
现在编译器给出了这两个错误:
character.h:25:90: error: expected ‘’ at end of input
25 | Player(sf::Vector2f starting_pos, std::list<Object *> *around) : Character(around);
和
character.cpp:3:1: error: redefinition of ‘Player::Player(sf::Vector2f, std::__cxx11::list<Object*>*)’
3 | Player::Player(sf::Vector2f starting_pos, std::list<Object *> *around)
| ^~~~~~
所以在我看来,它希望我在 .h 文件中定义代码,然后抱怨我没有在 .cpp 文件中这样做。如果我将代码直接放在 .h 文件中,它可以工作,但我不想这样做。
我不确定这些是否与它有关,所以这里有更多信息:
character是继承自object的抽象类,player继承自character。另外:cpp 文件中存在第二个错误,表示在此上下文中无法访问对象。
我发现很多人都缺少右大括号,但没有关于缺少左大括号的事情。
感谢您的帮助
【问题讨论】:
【参考方案1】:在你的头文件中
Player(sf::Vector2f starting_pos, std::list<Object *> *around) : Character(around);
导致错误的原因。由于您在那里使用了初始化列表,因此编译器希望完整的函数定义也在那里。只需从该行中删除 Character
的初始化程序,并将其移至您的 C++ 文件中。
.h 文件
Player(sf::Vector2f starting_pos, std::list<Object *> *around);
.cpp 文件
Player::Player(sf::Vector2f starting_pos, std::list<Object *> *around) : Character(around)
//code
【讨论】:
【参考方案2】:您的 ctor-initialiser 继续定义,而不是构造函数的声明。
你混淆了编译器,[有效地]编写了一个没有的定义(它必须是一个定义,因为它上面有ctor-initialiser)(因为你的意思是它是一个声明)......然后稍后提供[另一个]定义。
【讨论】:
以上是关于c ++预期的左大括号以及重新定义错误的主要内容,如果未能解决你的问题,请参考以下文章
Cloud Functions 错误:函数返回未定义、预期的 Promise 或值,以及 TypeError:无法读取未定义的属性“First_Name”