警告C26812: 枚举类型未使用范围限定符。建议使用enum class代替enum。

8
我很困惑为什么会收到这个警告,因为我的整个代码中甚至没有枚举吗?
#include <SFML/Graphics.hpp>
#include <vector>

using sf::RenderWindow;
using sf::VideoMode;
using sf::Event;
using std::vector;
using sf::Vector2f;
using sf::RectangleShape;
using sf::CircleShape;
using sf::Color;
using sf::Keyboard;

int main()
{
    RenderWindow window(VideoMode(720, 640), "Shooter game w Projectiles.");
    window.setFramerateLimit(60);

    CircleShape player(50.f);
    player.setFillColor(Color::White);
    player.setPosition((window.getSize().x / 2.f) - (player.getRadius()), (window.getSize().y - player.getRadius() * 2) - 10.f);

    CircleShape bullet(5.f);
    bullet.setFillColor(Color::Red);

    vector<CircleShape> playerBullets;
    playerBullets.push_back(bullet);

    RectangleShape enemy(Vector2f(30.f, 30.f));
    enemy.setFillColor(Color::Magenta);
    enemy.setPosition(320, 200);

    vector<RectangleShape> enemies;
    enemies.push_back(enemy);

    enemy.setFillColor(Color::Blue);
    enemy.setPosition(160, 100);
    enemies.push_back(enemy);

    while (window.isOpen())
    {
        Event event;
        while (window.pollEvent(event))
        {
            if (event.type == Event::Closed)
            {
                window.close();
            }
        }

        if (Keyboard::isKeyPressed(Keyboard::Escape))
        {
            window.close();
        }

        // Update
        Vector2f playerCenter = Vector2f(player.getPosition().x + player.getRadius(), player.getPosition().y + player.getRadius());

        // Clear
        window.clear();

        // Draw
        window.draw(player);
        for (size_t i = 0; i < enemies.size(); ++i)
        {
            window.draw(enemies[i]);
        }

        for (size_t i = 0; i < playerBullets.size(); ++i)
        {
            window.draw(playerBullets[i]);
        }
        

        // Display
        window.display();
    }
}

这是我收到的警告:枚举类型 'sf::PrimitiveType' 未被限定。建议使用 'enum class' 而不是 'enum' (Enum.3)。
它在第79行警告我,基本上是在主函数闭合括号后的新行上吗?

2
正如它所说,sf::PrimitiveType 是一个枚举类型。这个警告是正确的。如果你对这种类型的警告不感兴趣,你可以直接禁用它。 - spectras
2
你已经包含了<SFML/Graphics.hpp>,它已经为你声明了。你不能真正“解决”这个警告,因为那不是你的代码。你可以提交一个错误报告,但他们不会更改它,因为这会破坏其他人的代码。所以最好的选择就是禁用它。 - spectras
1
根据您使用的工具,您可能能够将SFML包含标记为系统包含,这样编译器就不会为其生成警告。例如,对于gcc,当您提供SFML的包含路径时,应使用-isystem而不是-I - spectras
2
这是与工具相关的。具体操作方式取决于您使用的是gcc、clang、msvc等。因此,您应该告诉我们您正在使用哪个构建工具,然后希望有人能够使用与您相同的工具来回答 :) - spectras
1
禁用遗留和第三方头文件的警告。 - Thrasher
显示剩余3条评论
1个回答

10

不幸的是,这个警告来自头文件SFML\Graphics.hpp,唯一的选择是联系SFML开发人员,并像评论区中@ spectras建议的那样要求他们修复此警告。

没有解决方案可以解决此警告。但是,最好通过将其封装在两个pragma语句中来禁用来自此第三方头文件的所有警告:

#pragma warning(push, 0)
#include <SFML/Graphics.hpp>
#pragma warning(pop)
感谢@Thrasher在评论区提供链接。这是链接:
https://blog.bytellect.com/software-development/c-cplusplus/disabling-warnings-from-legacy-and-third-party-header-files/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接