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 ++预期的左大括号以及重新定义错误的主要内容,如果未能解决你的问题,请参考以下文章

刀片引擎:打印三重花括号

keepalived怎么重新加载配置文件

C++ 11 正则表达式未按预期返回组

Cloud Functions 错误:函数返回未定义、预期的 Promise 或值,以及 TypeError:无法读取未定义的属性“First_Name”

矩阵类:错误:“)”标记之前的预期主表达式

python12_异常处理