转发声明映射的映射类型和C ++ 11

时间:2013-07-28 14:47:52

标签: c++ c++11 clang

我使用过的大多数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++

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

1 个答案:

答案 0 :(得分:4)

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

  

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

很少有组件明确声明允许模板参数不完整。那,你是在做一个标准未涵盖的假设。