2010-03-01 14 views
8

Sfida:Perché questa definizione separata causa un errore?

Ho questo codice che non riesce a compilare. Riesci a capire cosa c'è che non va? Mi ha causato mal di testa una volta.

// header 
namespace values { 
    extern std::string address; 
    extern int port; 
} 

// .cpp file 
std::string ::values::address = "192.0.0.1"; 
int   ::values::port = 12; 

Sembra corretto al primo sguardo. Quanti e quali sono gli errori !?

+0

Che cosa ha fatto il compilatore detto? –

+0

Conosci già la risposta? Suona come;) –

+0

@Nikolai, è più difficile provare senza xD –

risposta

8

Un errore:

std::string values::address = "192.0.0.1"; 

è la forma corretta, altrimenti la parse è

std::string::values::address = "192.0.0.1"; 

e non ci sono "valori" membri con un "indirizzo" membro interno "stringa" .. .

si lavorerà per incorporato tipi, in quanto non possono mai contenere membri .. così int :: valori è un parse unambigous, int :: valori, perché la prima non ha senso.

std::string (::values::address) = "192.0.0.1"; 

funziona anche. Si noti che se si digita typif in qualche modo; che avresti lo stesso problema usando qualcosa come con le string sopra, ma non con "int".

+0

ah, tu sei il vincitore. Neat :) –

+0

riparato. come da correzione di litb. –

3

Sono in ritardo al gioco, ma avrei preferito scrivere il file cpp come:

// .cpp file 
namespace values { 
    std::string address = "192.0.0.1"; 
    int   port = 12; 
} 

Certo che non risolve il problema che hai avuto con la dichiarazione friend.

+0

Sospetto che il mio esempio iniziale con la roba "indirizzo" sia zoppo :) L'esempio amico è molto meglio. Sono d'accordo con te che questo modo di definizione è il migliore :) –

Problemi correlati