std::variant 编译器找不到声明
std::variant declaration is not found by compiler
我想做的很简单,我需要创建一个可以容纳不同类型数据的向量。所以我阅读了 std::variant 并尝试使用它,但是,当声明我的“std::vector< std::variant< typenames >>”时,编译器抱怨没有找到 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 标准是不够的。您还必须将“-std=c++17”添加到 tasks.json,在“-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;
};
我想做的很简单,我需要创建一个可以容纳不同类型数据的向量。所以我阅读了 std::variant 并尝试使用它,但是,当声明我的“std::vector< std::variant< typenames >>”时,编译器抱怨没有找到 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 标准是不够的。您还必须将“-std=c++17”添加到 tasks.json,在“-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;
};