微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

编译器未找到 std::variant 声明

如何解决编译器未找到 std::variant 声明

我想做的很简单,我需要创建一个可以容纳不同类型数据的向量。所以我阅读了 std::variant 并试图使用它,但是,当声明我的“std::vector >”时,编译器抱怨没有找到variant的声明,即使我包括了变体库。 (错误是带有隐式命名空间的“使用未声明的标识符变体”,以及带有显式命名空间的“命名空间‘std’中没有名为‘variant’的成员”)。我的 Clang 版本是 11,我使用的是 c++17,所以我不知道我在这里会遗漏什么。就其价值而言,我目前使用的是 VScode 1.53。这是我的 c_cpp_properties.json :

{
    "configurations": [
        {
            "name": "Linux","includePath": [
                "${workspaceFolder}/**","/usr/include/"
            ],"defines": [],"compilerPath": "/usr/bin/clang","cStandard": "c17","cppStandard": "c++17","intelliSenseMode": "linux-clang-x64"
        }
    ],"version": 4
}

我也尝试过更改 vscode 提供的认 GUI 中的 cpp 版本来管理 cpp 编译器,这没有区别。

我正在做的事情与此类似:

#include <vector>
#include <variant>

struct c {
    std::vector< std::variant<glm::vec2,glm::vec3,glm::vec4>> v;
};

有没有人知道为什么会发生这种情况,或者以前遇到过这个问题并且知道解决方案?

解决方案: 结果证明在文件 c_cpp_properties.json 上指定 cpp 标准是不够的。您还必须在 tasks.json 中添加“-std=c++17”,在“-g”之后,如下所示:

{
    "tasks": [
        {
            "type": "cppbuild","label": "C/C++: clang++ build active file","command": "/usr/bin/clang++","args": [
                "-g","-std=c++17",...

解决方法

我不是 Clang 专家,但请尝试使用选项 -std=c++17

根据 this,默认似乎是 C++98。

,

这似乎在 MSVC 中工作正常:

#include <variant>

struct c {
    std::vector< std::variant<int,float>> v;
}

似乎编译器可能对模板类型嵌套不满意(这里是猜测)。也许可以尝试以下解决方法:

#include <variant>

struct c {
    typedef std::variant< int,float> TwoPartVariant;
    std::vector< TwoPartVariant> v;
};

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。