2012-11-15 28 views
1

下面的C++ 0x/C++ 11特性(初始化器列表,包括STL容器)應該允許我在聲明時初始化STL std::map。而且,它在g ++ 4.7.2中工作得很好,但是在g ++ 4.4.6中編譯時出現錯誤。根據GCC文檔,這個C++ 0x特性在4.4中可用,但很明顯無論是(a)我做錯了什麼,或者(b)它在g ++ 4.4中是不完整的。g ++ STL容器initializer_list在4.4和4.7之間的差異

std::map<std::string,std::vector<std::string>> 
DbConnection::attrs_of_type = { 
    { "http",   { "url", "ipaddress", "port", 
          "username", "password" } }, 
    { "email",   { "address", "full_name" } }, 
    { "ftp",   { "hostname", "ipaddress", "port", 
          "username", "password", "filename" } } 
}; 

但是,當我嘗試編譯正在GCC 4.4.6,我得到以下no matching function call錯誤,在它的典型的「幾乎無法理解」的方式:

database.cc:164: error: no matching function for call to ‘std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > > >::map(<brace-enclosed initializer list>)’ 
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_map.h:195: note: candidates are: std::map<_Key, _Tp, _Compare, _Alloc>::map(std::initializer_list<std::pair<const _Key, _Tp> >, const _Compare&, const _Alloc&) [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >] 
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_map.h:181: note:     std::map<_Key, _Tp, _Compare, _Alloc>::map(std::map<_Key, _Tp, _Compare, _Alloc>&&) [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >] 
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_map.h:170: note:     std::map<_Key, _Tp, _Compare, _Alloc>::map(const std::map<_Key, _Tp, _Compare, _Alloc>&) [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >] 
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_map.h:150: note:     std::map<_Key, _Tp, _Compare, _Alloc>::map() [with _Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Tp = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, _Compare = std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, _Alloc = std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >] 

(有沒有可能改變粘貼格式如何,所以它不需要儘可能多的水平滾動?)

無論如何。在這一點上,我試圖弄清楚爲了讓這個初始化在g ++ 4.4.6中工作,我必須採取不同的措施。有什麼我可以改變的方式我宣佈std::map,或std::vector,這將解決問題?還是必須使用完全不同的方法,因爲g ++ 4.4中的這個C++ 11特性的不同和/或不完整的實現?

+0

問一個很明顯的問題:你正在用g ++ 4.4中的'-std = C++ 0x'進行編譯嗎? –

回答

1

您的代碼是正確的。 g ++ - 4.4正式支持初始化列表。但我記得(我遵循wg21論文)有一個問題,特別是關於無法按照您在委託中某種程度上(與嵌套)的方式來初始化容器的問題。

由於這些更改是在以後完成的,很可能g ++ - 4.4沒有完全支持std::initializer_list語法。