1

我想我在 libc++ 列表实现中发现了一个错误。在 xcode 中使用某些构建设置时,以下代码将产生编译器错误(字段具有不完整的类型 'foo'):

#include <list>

using namespace std;

class foo {
    public:
        list<foo> bar;
};

设置如下:

XCode 版本: 4.4.1
C++ 语言方言: C++11 或 GNU++11
C++ 标准库:具有 C++ 扩展的 LLVM C++ 标准库 (libc++11)

使用 GCC 的 libstdc++ 将解决该错误。
不使用 C++11 方言将解决该错误。
使用向量而不是列表将解决该错误。

我认为这是列表实现中的一个错误,但我不确定。
原谅我的无知,但我不知道我应该怎么做才能解决这个问题。
在我的项目中切换到矢量不是一个选项,我绝对需要 C++11 功能。这也包括 shared_ptr,但使用 GCC 时缺少标头。除此之外,苹果似乎不再提供新版本的 GCC。

如果有人可以重新创建此问题,我将不胜感激,也许使用来自 libc++ 的新标头。

另外,如果更新 LLVM/libc++ 可以解决这个问题,你推荐吗?

4

1 回答 1

3

C++ 标准 17.6.4.8:

在某些情况下(替换函数、处理函数、用于实例化标准库模板组件的类型的操作),C++ 标准库依赖于 C++ 程序提供的组件。如果这些组件不满足其要求,则标准对实施没有要求。

特别是,在以下情况下效果是不确定的:

  • ...
  • 如果在实例化模板组件时将不完整的类型 (3.9) 用作模板参数,除非该组件特别允许。

标准库的容器类模板,包括list,都没有提到任何对不完整类型的允许。所以你的程序是一个无效的程序,可能碰巧可以与某些编译器一起使用。这不能被视为标准库实现中的错误。

于 2012-09-15T04:46:48.643 回答