2013-04-26 1 views
5

Ho problemi a capire un errore. Sto lavorando con una mappa lineare di vettori (digitato da fili e memorizzare vettori di stringhe):Perché le parentesi fanno la differenza quando si inizializza un vettore vuoto?

typedef std::map<std::string, std::vector<std::string> > TRouteMarkets; 

Il codice seguente (ridotta),

void CFoo::Bar(const char* route, const char* market) 
{ 
    // ... 

    TRouteMarkets::key_type key(route); 
    TRouteMarkets::mapped_type mapped(); 
    TRouteMarkets::value_type pair(key, mapped); 

    // ... 
} 

produce il seguente errore:

"Foo.cc", line 518: Error: Could not find a match for std::pair<const std::string, std::vector<std::string>>::pair(const std::string, std::vector<std::string>()) needed in CFoo::Bar(const char*, const char*).

Ma rimuovere il () da mappata, cioè

TRouteMarkets::mapped_type mapped; 

corregge l'errore. Perché? mapped non è un vettore vuoto di stringhe in entrambi i casi?

+4

Leggi [l'analisi più irritante] (http://en.wikipedia.org/wiki/Most_vexing_parse). –

+0

Abbiamo davvero bisogno di un correttore automatico per il parsing e la famiglia irritante. Ho avuto una buona idea dal titolo della domanda che cosa sarebbe, viene fuori così spesso (c: –

+3

Questo non è il parsing più irritante – hmjd

risposta

7

Questo è in realtà una dichiarazione di funzione:

TRouteMarkets::mapped_type mapped(); 

dichiarare una funzione denominata mapped che non accetta argomenti e restituisce un TRouteMarkets::mapped_type.

5

Hai riscontrato il problema Most Vexing Parse.

TRouteMarkets::mapped_type mapped(); 

La riga precedente sta dichiarando una funzione denominata mapped che non accetta argomenti e restituisce un oggetto di tipo TRouteMarkets::mapped_type.

Con C++ 11, è possibile utilizzare la sintassi di inizializzazione uniforme per evitare questo problema.

TRouteMarkets::mapped_type mapped{}; // Not a function declaration anymore 
+0

Ah, tutto è di nuovo chiaro, non posso credere di non aver mai avuto questo problema in precedenza! Grazie e scuse a @hmjd e @@ JoachimPileborg che solo uno può essere premiato per la risposta –

+3

Questo non è il parsing più irritante – hmjd

+0

@hmjd Come non è? – Praetorian