【问题标题】:No type named 'nullptr_t' in namespace 'std'命名空间“std”中没有名为“nullptr_t”的类型
【发布时间】:2014-08-18 22:25:13
【问题描述】:

有人正在编译我使用 C++11 标准的 Qt 程序,但他们收到了这个错误 (Mac OS X / gcc)。我知道我可以声明它,但它不应该已经在<cstddef> 中吗?

./collectable_smartptr.hpp:54:33: error: no type named 'nullptr_t' in namespace 'std'
void operator=(std::nullptr_t &null)

这段代码在 Windows 和 Linux 上运行良好,我只在 Mac 上看到。

Mac 是 i386-apple-darwin11.3.0,编译器是:

$ g++ --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.2.0
Thread model: posix

g++ 选项(一些)是-c -pipe -std=c++11 -O2 -arch x86_64 -Xarch_x86_64 -mmacosx-version-min=10.5 -Wall -W -DQT_USE_QSTRINGBUILDER -DQT_NO_DEBUG -DQT_WEBKIT_LIB -DQT_XML_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_SHARED

这正常吗?或者在 Mac 上需要做些什么才能让 C++11 正常工作?

【问题讨论】:

  • #include <cstddef>了吗?
  • 我必须这样做吗?如果需要,为什么它可以在 linux 和 windows 上运行?
  • 这是包含该类型定义的标题。也许它碰巧起作用了,因为在这些平台上为您包含了其他一些标头,但这不是必需的。
  • 仅仅因为您的代码在您依赖于实现细节时恰好可以工作,并不意味着代码是正确的。你有一个错误。影响可移植性的错误 - 显然如此。修理它。这就是它的全部。对于未来,您可以查看cppreference - 对于每个标准类,它会告诉您必须包含哪些标头。未能包含它并不意味着它不适用于所有平台。它可能对某些人有效。它甚至可以工作,但有一些微妙的错误会在以后咬你。你已经被警告了:)
  • @Petr:首先尝试给出一个可复制的例子。

标签: macos qt gcc c++11


【解决方案1】:

当我将sstream 包含在命名空间std 中时,我遇到了同样的问题:

namespace std {
// Some #ifdefs and so on
// quite hidden
#include <sstream>
}

将包含移出命名空间解决了这个问题:

#include <sstream>
namespace std {
}

编译器:不含 C++11 的 Apple LLVM 版本 8.0.0 (clang-800.0.38)。

【讨论】:

    【解决方案2】:

    明确地包含内容总是更好,所以我会将其添加到代码中:

    #include <cstddef>
    

    如果这不起作用,则意味着您的系统存在根本问题,即:

    • 您没有使用足够新的标准库实现(例如尝试 libc++)。
    • 您没有启用 C++11 和 on 编译。

    作为一种快速而讨厌的解决方法,您当然可以自己执行 typedef,如下所示:

    namespace std {
        typedef decltype(nullptr) nullptr_t;
    }
    

    或者没有std,但这确实应该是最后的手段,通常这意味着你做错了什么。

    【讨论】:

    • 这不起作用:错误:命名空间“std”中没有名为“nullptr_t”的类型
    • @Petr:更新您的 libc++ 实现,或在 Mac 上自行执行 typedef decltype(nullptr) nullptr_t;
    • 不,我发布了有助于区分答案的代码,我知道它可能不是一般的正确答案,但也许其他可能面临这个问题的人可能会受益于了解它
    • 确实,我只是没有注意到你在这里写的:P 我在另一篇文章中找到了它...但是谢谢
    【解决方案3】:

    使用#include &lt;cstddef&gt; 没有解决问题,但插入

    namespace std
    {
        typedef decltype(nullptr) nullptr_t;
    }
    

    显然帮助解决了这个问题,尽管我仍然不明白为什么真的需要它。

    PS:鉴于我不是发生这种情况的计算机的所有者,我无法进行任何进一步调查,详情请参阅https://github.com/huggle/huggle3-qt-lx/issues/101

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-21
      • 2014-12-21
      • 1970-01-01
      • 1970-01-01
      • 2020-04-21
      • 2013-05-27
      • 2012-11-08
      相关资源
      最近更新 更多