5

我使用过的大多数 C++ 编译器都接受以下内容

#include <map>

struct A;

struct B
{
    typedef std::map<int,A>::iterator iterator;
    std::map<int,A> test;
};

struct A
{
};

int main()
{
    return 0;
}

但是,Apple clang 4.0 编译时使用

clang++ test.cpp -o test -std=c++11 -stdlib=libc++

产生一组错误,暗示 A 在 std::map 可以使用之前必须是一个完整的类型。这是 map 的 libc++ 实现中的缺陷、C++11 强加的新要求还是我的错误假设?

4

1 回答 1

6

根据 17.6.4.8 [res.on.functions] 第 2 段的要求,它指出:

特别是,在以下情况下效果是未定义的: ...如果在实例化模板组件时将不完整的类型 (3.9) 用作模板参数,除非该组件特别允许。

很少有组件明确声明允许模板参数不完整。也就是说,您正在做出标准未涵盖的假设。

于 2013-07-28T14:59:40.123 回答