2012-06-28 19 views

Odpowiedz

7

nagłówka: plik

class XXX { 
private: 
    static std::map<X,Y> the_map; // declares static member 
// ... 

realizacji:

std::map<X,Y> XXX::the_map; // defines static member 

To będzie wstawić wywołanie konstruktora dla twojej mapie do kodu inicjalizacji programu (i destruktora do czyszczenia). Bądź jednak ostrożny - kolejność konstruktorów statycznych takich jak ta między różnymi jednostkami tłumaczeniowymi jest niezdefiniowana.

+0

Mówi, że moja mapa jest prywatna, więc domyślna inicjalizacja na górze mojego pliku CC jest nieprawidłowa. –

+0

Po przesłaniu kodu, gdzieś popełnisz błąd. –

+0

Musiałem przenieść mój typedef do publicznego, ale zachowałem mojego członka prywatnego. To naprawiło to. –

5

Jak o tym (jeśli dobrze rozumiem poprawnie):

std::map<T,T2> YourClass::YourMember = std::map<T,T2>(); 
+0

Lub po prostu 'std :: map YourClass :: YourMember;' –

+0

@MikeSeymour: Dokładnie. Po prostu wyjaśnienie, że możesz podać argumenty konstruktora, jeśli chcesz. – Linuxios

3

Jeśli zdefiniować go w definicji klasy, to musisz zadeklarować ją w realizacji:

--- test.h ---

// includes and stuff... 
class SomeClass 
{ 
    private: 
     static std::map<int,std::string> myMap; 
}; 

--- test.cpp ---

std::map<int,std::string> SomeClass::myMap; // <-- initialize with the map's default c'tor 

Można użyć inicjalizacji, zbyt :

std::map<int,std::string> SomeClass::myMap = std::map<int,std::string>(myComparator); 
+0

Nitpick: Byłby/zadeklarowany/w klasie i/zdefiniowany/w implementacji. – Grault

Powiązane problemy