2013-07-28 68 views
3

大多數C++編譯器我曾與接受以下正向聲明地圖的映射的類型和C++ 11

#include <map> 

struct A; 

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

struct A 
{ 
}; 

int main() 
{ 
    return 0; 
} 

然而,蘋果鐺4.0

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

產生編譯在std :: map可以使用之前,暗示A必須是完整類型的錯誤集合。這是map的libC++實現中的一個缺陷,這是C++ 11強加的一個新要求,還是我的錯誤假設?

回答

4

根據17.6.4.8要求[res.on.functions]段落2它指出:

特別地,該效果在下列情況下是不確定的:...如果一個不完整的類型( 3.9)在實例化模板組件時用作模板參數,除非該組件特別允許。

很少有組件明確指出允許模板參數不完整。那你是在做一個沒有被標準覆蓋的假設。

+0

我認爲會是這樣。 –