在C++11中提前声明map的映射类型

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++

在使用std::map之前,必须保证A是一个完整的类型。如果出现一系列错误提示,则意味着这是libc++实现map时存在的缺陷,还是C++11提出的新要求,或者是我的假设有误?


更新:上述代码在删除“-stdlib=libc++”后,可以使用clang++-3.8.0编译通过。 - iammilind
1个回答

7
根据17.6.4.8 [res.on.functions]第2段的要求,它指出:
特别地,在以下情况下效果是未定义的:……在实例化模板组件时使用不完整类型(3.9)作为模板参数,除非该组件明确允许。
很少有组件明确声明允许使用不完整的模板参数。也就是说,您正在做一种标准未涵盖的假设。

我以为会是这样的情况。 - Adam Bowen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接