2012-06-28 13 views

Antwort

7

Rubrik:

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

Implementierungsdatei:

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

dass ein Konstruktoraufruf für Ihre Karte einfügen wird in Ihren Programminitialisierungscode (und einen Destruktor in die Bereinigung). Seien Sie jedoch vorsichtig - die Reihenfolge der statischen Konstruktoren zwischen verschiedenen Übersetzungseinheiten ist nicht definiert.

+0

Es besagt, dass meine Map privat ist und daher die Standardinitialisierung am Anfang meiner CC-Datei ungültig ist. –

+0

Poste deinen Code, du machst irgendwo einen Fehler. –

+0

Ich musste meine Typedef in die Öffentlichkeit verschieben, behielt aber mein Mitglied privat. Das hat es behoben. –

5

Wie wäre es damit (wenn ich Sie richtig verstanden habe):

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

Oder einfach 'std :: map YourClass :: YourMember;' –

+0

@MikeSeymour: Genau. Erklären Sie nur, dass Sie Konstruktorargumente geben können, wenn Sie möchten. – Linuxios

3

Wenn Sie es in der Klassendefinition definieren, dann haben Sie es in der Umsetzung zu erklären:

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

Sie eine Initialisierung verwenden können, zu :

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

Nitpick: Das wäre/deklariert/in der Klasse und/definiert/in der Implementierung. – Grault

Verwandte Themen