2016-05-10 6 views
-3

Unten ist ein Codeabschnitt, die Probleme Abrufen der Größe eines Arrays hat, basierend auf ob oder ob nicht die Anordnung statisch ist oder nicht.Erhalten der Größe eines const char * const a [30] hat Schwierigkeiten Größe Bestimmung vor Objektinitialisierung

struct foo 
{ 
    static const char* const a[30]; 
    const char* const b[30]; 
    const int ia = __countOf(a) // compiles 
    const int ib = __countOf(b) // has compile errors related to initialization 
}; 
+1

Ist „nicht kompilieren“ die beste Sie können das Problem beschreiben tun? –

+0

lassen Sie mich traurig umformulieren, es ist nur die Fehler, die ich von vs bekommen nicht viel Sinn machen die Kompilierung verursacht unter die Definition immer Membervariable mit V2039 zum Scheitern verurteilt ist kein Mitglied von foo – user1881587

+2

das Beispiel nicht kompiliert. –

Antwort

5

Die minimale Beispiel oben nicht kompiliert ...

Aber was Sie wirklich war zu fragen, gemeint: „Warum nicht kompiliert es, wenn ich foo Referenz :: b“?

Es ist, weil alle const Mitglieder in einem Konstruktor initialisiert werden muss (und zwar in der Initialisierungsliste des Konstruktors, nicht im Körper).

Ab C++ 11 Standardwerte in der Klassendefinition zur Verfügung stellen kann:

#include <iostream> 

struct foo 
{ 
    static const char* const a[30]; // compiles 
    const char* const b[30] = {"Hello", "World" /*insert others here */ }; 
}; 


const char* const foo::a[30] = { 
    "Hello", "Cruel", "World", /* etc */ 
}; 

int main() 
{ 
    foo f; 
    std::cout << f.b[0] << std::endl; 
    std::cout << f.a[2] << std::endl; 
    return 0; 
} 
+0

Nun, das Kompilieren beinhaltet die Verknüpfungsstufe, nicht wahr? –

+0

@ πάνταῥεῖ der Code in der Frage für mich auch verlinkt gepostet. Die fehlenden Memberdefinitionen wurden durch nichts referenziert. –

+0

Sicher, wenn nichts darauf verweist, wird sich der Linker nicht beschweren. Aber das OP hat wahrscheinlich übersehen, dass es tatsächlich irgendwo referenziert wird. –

Verwandte Themen