正向声明映射的映射类型和C++;11 我所用过的大多数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; }

正向声明映射的映射类型和C++;11 我所用过的大多数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; },c++,c++11,clang,C++,C++11,Clang,生成一组错误,这些错误意味着在使用std::map之前必须是完整类型。这是map的libc++实现中的缺陷,是C++11强加的新要求还是我的错误假设?根据17.6.4.8[res.on.functions]第2段中的要求,它声明: 特别是,在以下情况下,效果未定义:。。。如果在实例化模板组件时将不完整类型(3.9)用作模板参数,除非该组件特别允许 很少有组件明确声明允许模板参数不完整。也就是说,你正在做一个标准中没有包含的假设。我想应该是这样。更新:上面的代码可以用clang++-3.8.0编译

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

根据17.6.4.8[res.on.functions]第2段中的要求,它声明:

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


很少有组件明确声明允许模板参数不完整。也就是说,你正在做一个标准中没有包含的假设。

我想应该是这样。更新:上面的代码可以用clang++-3.8.0编译好[删除
-stdlib=libc++
]。
clang++ test.cpp -o test -std=c++11 -stdlib=libc++