【问题标题】:std::variant declaration is not found by compiler编译器找不到 std::variant 声明
【发布时间】:2021-02-12 17:55:08
【问题描述】:

我要做的很简单,我需要创建一个可以容纳不同类型数据的向量。因此,我阅读了有关 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",
                     ...

【问题讨论】:

  • 你试过更新你的编译器吗?
  • 如果编译器不抱怨#include &lt;variant&gt;,它不应该在以后抱怨std::variant。您的项目中有名为variant 的文件吗?
  • glm 命名空间中所有这些类型的声明在哪里?您应该显示minimal reproducible example,而不是显示“类似于此代码”,任何人都可以完全按照显示剪切/粘贴并得到相同的编译错误。
  • 我没有任何其他名为 variant 的文件或类,而且它没有抱怨 #include 但关于变体的事实让我感到困惑。我展示的类型是我打算使用的类型,但是如果我声明,例如,variant 编译器会弹出关于第一个问题的相同错误,我刚刚检查过,我的编译器也最多日期。

标签: c++ std variant


【解决方案1】:

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

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

【讨论】:

  • 正如我在帖子中所说,我已经在 c_cpp_properties.json 中进行了更改,但是显然这还不够,所以根据您的建议,我更改了文件 tasks.json,添加了“-std=c++” “-g”之后的 17"。所有错误都消失了。谢谢!
【解决方案2】:

这似乎在 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;
};

【讨论】:

  • 试过了,不幸的是出现了同样的错误:no template named variant on namespace std 真正奇怪的是,在 cpp 属性文件上将行从 c++11 更改为 c++17 之后,编辑器给变体名称上色,好像认出来了,但还是没找到声明
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多