std type_traits 与 Qt type_traits 冲突

Posted

技术标签:

【中文标题】std type_traits 与 Qt type_traits 冲突【英文标题】:std type_traits conflict with Qt type_traits 【发布时间】:2017-04-01 13:53:53 【问题描述】:

我安装了 Qt 5.8,但出现此错误。 我的 pro 文件中也有 CONFIG += c++14,我也尝试过使用 c++11。

/usr/include/x86_64-linux-gnu/qt5/QtCore/qtimer.h:106: error: ‘is_same’ is not a member of ‘QtPrivate’!QtPrivate::is_same<const 

还有

/usr/include/c++/5/type_traits:958: note:   ‘std::is_same’
     struct is_same;

【问题讨论】:

这个问题可以通过一些上下文和细节来改进:1)错误信息似乎被切断了,提供完整的信息。 2) 什么时候你得到那个错误?编译您的应用程序之一?编译 Qt? 可能相关:bugreports.qt.io/browse/QTBUG-57020 您确定安装的版本吗? This commit 应该修复这个 IMO,据我所知,它应该在 5.8.0 中。 /usr/include/ x86_64-linux-gnu /qt5/QtCore/qtimer.h 看起来很奇怪。也许您正在混合来自不同版本 Qt 的头文件? 【参考方案1】:

根据@DanielJour 对问题的评论,我一直在 Qt git 存储库中进行一些挖掘。

查看文件 qtimer.h 的历史记录并将其与您的错误消息 (qtimer.h:106: error: ‘is_same’ is not a member...) 相关联,我发现 this commit 将调用从第 106 行移至第 112 行对 is_same 的调用(并且再也没有回来),因此您将包含来自该提交之前qtimer.h

该提交来自 2016 年 1 月 15 日,并且从 Qt 5.7 开始包含在内。

所以我猜你已经安装了几个不同版本的 Qt,并且不知何故你的程序包含了旧的头文件,而不是来自 Qt 5.8 的头文件。

另一个让我得出这个结论的注释是,您的头文件位于/usr/include/x86_64-linux-gnu/qt5/,但通常安装的位置位于/usr/include/qt/usr/include/qt5。你的看起来像一个多库或交叉编译器路径......

【讨论】:

以上是关于std type_traits 与 Qt type_traits 冲突的主要内容,如果未能解决你的问题,请参考以下文章

SFINAE 与 type_traits

STL源码剖析——Iterators与Traits编程#5 __type_traits

第17课 类型萃取_基本的type_traits

还搞不懂STL的type_traits?从源码来带你一起分析!!!

还搞不懂STL的type_traits?从源码来带你一起分析

std::visit 和 std::variant 用法