使用 C++11 时列表中的编译错误

Posted

技术标签:

【中文标题】使用 C++11 时列表中的编译错误【英文标题】:Compilation error in list while using C++11 【发布时间】:2020-04-20 19:47:09 【问题描述】:

使用 std=c++11 选项编译 C++ 代码时出现以下错误。

In file included from /usr/include/c++/7/list:63:0,
                 from /usr/include/qt4/QtCore/qlist.h:51,
                 from /usr/include/qt4/QtCore/QList:1,

/usr/include/c++/7/bits/stl_list.h:591:68: error: ‘std::is_nothrow_default_constructible<typename std::__cxx11::_List_base<_Tp, _Alloc>::_Node_alloc_type>::value’ is not a type
       noexcept(is_nothrow_default_constructible<_Node_alloc_type>::value)

代码编译,如果我使用 std=c++98 选项!但我需要使用 C++11 编译它。

【问题讨论】:

奇怪。这是第一个错误和整个错误消息吗? 你做了一些奇怪的事情。无论放入列表中的类都无法创建is_nothrow_default_constructible 模板。由于它唯一能做的事情是真或假,这意味着很可能根本无法构造该类。我们肯定需要查看更多代码。并且一定要尝试制作一个只包含一个类而不是所有 Qt 垃圾的小型测试程序,看看它是否可以编译。 我的超能力表明,在 2005 年至 2011 年间开发的 Qt 4 不符合 C++11。 @ZanLynx 你是对的。我使用的是旧版本“0.9.9”SQLiteCpp (github.com/SRombauts/SQLiteCpp)。为了检测 C++11 编译器,他们使用了 #if (defined(GNUC) && (GNUC >= 4 && GNUC_MINOR >= 7 ) && defined(GXX_EXPERIMENTAL_CXX0X)),它没有按预期工作。我将其更改为 #if (__cplusplus >= 201103L) 以消除错误。谢谢。 【参考方案1】:

正如 ZanLynx 正确怀疑的那样,错误是从代码的其他部分引发的。 我使用的是旧版本“0.9.9”的 SQLiteCpp (github.com/SRombauts/SQLiteCpp)。为了检测 C++11 编译器,他们使用了 #if (defined(GNUC) &amp;&amp; (GNUC &gt;= 4 &amp;&amp; GNUC_MINOR &gt;= 7 ) &amp;&amp; defined(GXX_EXPERIMENTAL_CXX0X)),但没有按预期工作。我将其更改为#if (__cplusplus &gt;= 201103L),从而消除了错误。 谢谢 ZanLynx!

【讨论】:

以上是关于使用 C++11 时列表中的编译错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 ARM GCC 编译列表迭代器时的模板编译时错误

使用赋值运算符 =? 时 C++ 中的编译错误

出现中文符号时,编译错误信息显示啥

C语言编译时的错误

Visual Studio C++11g 编译错误 - 初始化程序太多

Visual Studio 2013 中可能存在的 C/C++ 编译器错误