最近在编译一个用到C++14特性的工程时,遇到这样一个问题。
编译时报:error: ‘decay_t’ is not a member of ‘std’
std::decay_t属于C++14加入的特性,需要 #include <type_traits>,set(STD_CXX -std=gnu++14) 使用 C++14也可以。
但这些设置都是有的,查看type_traits文件,发现这些新特性语句在 #if __cplusplus > 201103L 语句中包含,把main函数只剩std::cout << __cplusplus <<std::endl; 发现,__cplusplus是201103
这就纳闷了,明明已经指定set(STD_CXX -std=gnu++14) 了呀,__cplusplus应是201402
其它工程测试,__cplusplus是201402,因此怀疑是Qt5导致的,通过逐步删除CMakeList.txt文件中的与Qt5相关的语句调试,发现,只有加入 target_link_libraries(${PROJECT_NAME} Qt5::Widgets Qt5::Qml),__cplusplus就成为201103,使用Qt5.6版本,没有这个问题,5.8跟5.7一样,有此问题。
Qt官网求答案,原来是这样:
If you use Qt 5.7 and a CMake
version above 3.1.0, plus require a more recent C++ standard version, use the CMake way of selecting the standard version, or specify features required and let CMake compute the flags. Example:
set(CMAKE_CXX_STANDARD 14)
在CMakeList.txt文件中加入这一句,问题得以解决。真是Qt5跟cmake联合挖坑啊!