gpt4 book ai didi

c++ - C2386 : 'void_t' : a symbol with this name already exists in the current scope

转载 作者:搜寻专家 更新时间:2023-10-31 00:08:42 25 4
gpt4 key购买 nike

我正在开发一个 Qt 项目,该项目旨在构建在 WindowsLinux 上。作为构建系统,我在 Ubuntu 16.04 上使用 CMake 和 GCC 5.4,在 Windows 10 上使用 Visual Studio 2017。因为当前使用的标准是 但我想使用便利类型 std::void_t我定义如下:

#if __cplusplus >= 201703L
#include <type_traits>
#else
namespace std {
template<typename... Ts> struct make_void { typedef void type; };
template<typename... Ts> using void_t = typename make_void<Ts...>::type;
}
#endif

如果我在 Linux 下使用提到的编译器构建项目,上面的定义工作正常,但是当我尝试在 Windows 下构建它时,我收到以下错误消息:

C2386: 'void_t': a symbol with this name already exists in the current scope
U1077: 'C:\PROGRA~2\MICROS~4\2017\ENTERP~1\VC\Tools\MSVC\1411~1.255\bin\HostX64\x64\cl.exe' : return code '0x2'
U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.11.25503\bin\HostX64\x64\nmake.exe"' : return code '0x2'
U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.11.25503\bin\HostX64\x64\nmake.exe"' : return code '0x2'

顶级 CMake 文件设置 C++ 标准如下:

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

我不明白为什么当标准设置为 时 Visual Studio 2017 会提示 std::void_t .这是正常行为吗?我错误地认为以所示方式污染 std 命名空间不会导致错误?如何克服 Visual Studio 2017 产生的这些错误?


编辑: 我刚刚注意到依赖预定义宏 __cplusplus 的值可能会导致 unexpected results . This问题还针对 __cplusplus 宏。

最佳答案

Is this a normal behaviour and I expect it incorrectly that polluting the std namespace in the shown way won't cause errors?

标准库拥有 namespace std - 您只允许在某些特定情况下向其中添加内容。声明全新的类型不是其中一种情况,你不应该这样做。污染 namespace std 在某些时候是自找麻烦。

在这种特殊情况下,在标准库版本上使用您自己的 void_t 确实不会有任何损失。它会起作用的。所以就这样做吧。或者,如果您真的想使用标准的,请将其中之一带入不同的命名空间:

namespace xstd {
#if __cplusplus >= 201703L
using std::void_t;
#else
template<typename... Ts> struct make_void { typedef void type; };
template<typename... Ts> using void_t = typename make_void<Ts...>::type;
#endif
}

// use xstd::void_t throughout

关于c++ - C2386 : 'void_t' : a symbol with this name already exists in the current scope,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47642385/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com