- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在开发一个 Qt 项目,该项目旨在构建在 Windows 和 Linux 上。作为构建系统,我在 Ubuntu 16.04 上使用 CMake 和 GCC 5.4,在 Windows 10 上使用 Visual Studio 2017。因为当前使用的标准是 c++14但我想使用便利类型 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)
我不明白为什么当标准设置为 c++14 时 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/
我正在尝试练习 void_t 的用法,但以下代码给出了编译错误。 is_fun 是 CompS 结构中的 typedef,所以我认为 Comp::is_fun 应该是有效的。 我在这里遗漏了什么吗?
我在 Cppcon14 上观看了 Walter Brown 关于现代模板编程(Part I,Part II)的演讲,他展示了他的 void_t。 SFINAE 技术。 示例: 给定一个计算结果为 vo
最近我尝试编写围绕 void_t 的包装器,如下所示: namespace detail { template struct applicable : std::false_type {}; tem
这个问题在这里已经有了答案: How does `void_t` work (3 个答案) 关闭 7 年前。 我有一个关于 void_t 元函数的问题,在这个视频中显示 https://www.yo
我尝试运行以下代码,它应该依赖于 void_t技巧,应该选择更专业的类模板(在本例中是第二个) #include #include template using void_t = void; t
我需要帮助的第一件事是解决下面的歧义。但是一旦歧义消失,我仍然需要知道是否有更简洁优雅的方式来实现 8 个特化。 #include template using void_t = void; te
考虑以下代码: template > struct is_invokable : std::false_type {}; template struct is_invokable>> : std::
cppreference 上有一个关于使用别名的例子。此示例失败,因为 int 没有成员 foo: template using void_t = void; template void_t f();
当我第一次学习如何检查类中的特定签名时,我被教导使用 std::void_t 并编写如下代码: template class HAS:public false_type{}; template cla
此刻,我是 using this method to check if a class has a method with a specific signature. 参加后Walter E. Bro
对于 C++14 中的成员检测,我使用了基于示例 here 的代码, 但它似乎不起作用。 一个完整的例子: #include template using void_t = void; templ
我想实现一个 has_no_duplicates评估为 std::true_type 的类型特征如果传递的可变类型列表没有重复类型。 static_assert(has_no_duplicates{}
在 C++17 中,我们有 std::void_t,这让 SFINAE 看起来更漂亮: template std::void_t foo() { /* stuff */ } 只有 T::prop 存
我在以下代码中得到了意外结果(第二个 static_assert 失败): #include template struct is_bananas : std::false_type {}; te
下面是试图在编译时检查默认构造函数是否存在的代码段。编译这个 clang version 11.0.0 Target: x86_64-apple-darwin19.6.0 Thread model:
我正在学习模板元编程,最近,我看到了关于 CPPConference 的演讲。关于 void_t。不久之后,我发现了detection idiom . 但是,我仍然很难理解其中任何一个(尤其是检测习惯
#include template struct IsIterator final : std::false_type {}; template struct IsIterator::iterato
前几天我遇到了这个。 #include #include using namespace std; template struct make_void { typedef void type; }
我如何实现 C++ detection idiom不使用 void_t?换句话说,我可以仅使用 C++03 功能实现 C++17 std::is_detected 等吗? UPD 根据定义,检测习语需
我在看Walter Brown's CppCon2014 talk on template metaprogramming的第二部分,期间他讨论了他的小说void_t<>的用途 build 。在他的演
我是一名优秀的程序员,十分优秀!