【问题标题】:Cannot construct Vector2f object inside struct using SFML无法使用 SFML 在结构内构造 Vector2f 对象
【发布时间】:2014-05-12 21:54:49
【问题描述】:

您好,我在尝试此代码时遇到错误:

    #include <SFML/Window.hpp>
    #include <SFML/Graphics.hpp>

    const float ballVelocity = 8.f;

    struct Ball
    {
        Vector2f velocity(-ballVelocity, -ballVelocity);
    };

我正在使用 SFML 并通过教程进行操作,它应该可以工作,但 Visual Studio 在这一行中说:

Vector2f velocity(-ballVelocity, -ballVelocity);

需要一个类型说明符。

(编辑:要清楚我正在尝试创建 Vector2 的对象)

【问题讨论】:

  • 你偶然发现了vexing parse
  • @user2079303:不,他没有。当存在用户想要创建对象的语法,但语法与函数声明模棱两可,编译器将其解析为后者时,就会发生令人烦恼的解析。这完全是不正确的语法。或者至少,这是在这个特定上下文(类的主体)中不允许使用的语法。
  • @BenjaminLindley:嗯,他的意思是他的代码是一个对象创建,编译器确实将它解释为一个函数声明(尽管由于参数而失败)。即使这不是规范的令人烦恼的解析,我也认为这同样令人烦恼,因为编译器错误与不正确的函数声明有关,而不是与不正确的成员初始化有关。我敢打赌,c++11 没有使用这种特殊语法添加非静态成员初始化,因为它总是与函数声明模棱两可。

标签: c++ vector constructor sfml


【解决方案1】:

如果您尝试使用非静态数据成员初始化,则不能那样做。您需要使用大括号初始化或 equal(=) 初始化。这些中的任何一个都应该工作:

struct Ball
{
    Vector2f velocity {-ballVelocity, -ballVelocity};
};

或者这个:

struct Ball
{
    Vector2f velocity = Vector2f(-ballVelocity, -ballVelocity);
};

虽然,如果我没记错的话,SFML 的组件存在于sf 命名空间中,所以任何对Vector2f 的引用实际上都需要限定为sf::Vector2f

【讨论】:

    猜你喜欢
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多