我使用过的大多数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强加的新要求还是我的错误假设?
答案 0 :(得分:4)
根据17.6.4.8 [res.on.functions]第2段的要求,它指出:
特别是,在以下情况下效果未定义:...如果在实例化模板组件时将不完整类型(3.9)用作模板参数,除非特别允许该组件。
很少有组件明确声明允许模板参数不完整。那,你是在做一个标准未涵盖的假设。