簡體   English   中英

std :: map的類內初始化

[英]In-class initialization of std::map

我有這段不能在g ++ - 4.9.1下編譯的C ++代碼片段(我使用了命令“g ++ -c --std = c ++ 11 map.cc”)

#include <map>
#include <cstdint>
class A {
  std::map<uint8_t, uint8_t> b = std::map<uint8_t, uint8_t>();
};

編譯時出現以下錯誤:

map.cc:5:52: error: expected ‘;’ at end of member declaration
   std::map<uint8_t, uint8_t> b = std::map<uint8_t, uint8_t>();
                                                    ^
map.cc:5:52: error: declaration of ‘std::map<unsigned char, unsigned char> A::uint8_t’ [-fpermissive]
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.9/include/stdint.h:9:0,
                 from /usr/include/c++/4.9/cstdint:41,
                 from /usr/include/c++/4.9/bits/char_traits.h:380,
                 from /usr/include/c++/4.9/string:40,
                 from /usr/include/c++/4.9/stdexcept:39,
                 from /usr/include/c++/4.9/array:38,
                 from /usr/include/c++/4.9/tuple:39,
                 from /usr/include/c++/4.9/bits/stl_map.h:63,
                 from /usr/include/c++/4.9/map:61,
                 from map.cc:1:
/usr/include/stdint.h:48:24: error: changes meaning of ‘uint8_t’ from ‘typedef unsigned char uint8_t’ [-fpermissive]
 typedef unsigned char  uint8_t;
                        ^
map.cc:5:59: error: expected unqualified-id before ‘>’ token
   std::map<uint8_t, uint8_t> b = std::map<uint8_t, uint8_t>();
                                                           ^
map.cc:5:43: error: wrong number of template arguments (1, should be 4)
   std::map<uint8_t, uint8_t> b = std::map<uint8_t, uint8_t>();
                                           ^
In file included from /usr/include/c++/4.9/map:61:0,
                 from map.cc:1:
/usr/include/c++/4.9/bits/stl_map.h:96:11: error: provided for ‘template<class _Key, class _Tp, class _Compare, class _Alloc> class std::map’
     class map
           ^

但是,如果我用int替換uint8_t,它編譯得很好。

FWIW,如果您需要解決,以下工作:

class A {
   typedef std::map<uint8_t, uint8_t> B;
   B b = B();
};

g ++的問題要大得多,每當你使用模板作為類成員時,如果任何參數(第一個除外)是typedef或在另一個名稱空間中,你就不能使用成員初始化。

typedef int I;

template<typename T1, typename T2> struct A {};

struct B {
    A<I,float> a1=A<I,float>(); // works!
    A<float,I> a2=A<float,I>(); // does not compile!
    // This is the same reason the map does not comile, as string is a typedef
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM