2015-05-30 19 views
10

consideri il codice seguente:non statico inizializzazione membro dati con nuova espressione

#include <map> 

template <typename T> 
struct X { 
    std::map<int, T>* storage = new std::map<int, T>(); 
}; 

int main() { 
    X<int> x; 
} 

Questo compila il clang 3.6.0, ma non riesce a compilare su gcc 5.1. Si compilerebbe, tuttavia, se il tipo di storage fosse invece std::vector<T>* (o solo T*).

Sono abbastanza certo si tratta di un bug del compilatore da parte di gcc (edit: ho presentato come 66344), ma ho pensato di chiedere per assicurarsi che: v'è alcuna ragione l'esempio precedente non dovrebbe di compilazione ?

gcc errore di compilazione:

main.cpp:5:51: error: expected ';' at end of member declaration  
    std::map<int, T>* storage = new std::map<int, T>();  
               ^ 

main.cpp:5:51: error: declaration of 'std::map<int, T> X<T>::T'  
main.cpp:3:11: error: shadows template parm 'class T'  
template <typename T>  
     ^

main.cpp:5:52: error: expected unqualified-id before '>' token  
    std::map<int, T>* storage = new std::map<int, T>();  
                ^ 
main.cpp:5:46: error: wrong number of template arguments (1, should be at least 2)  
    std::map<int, T>* storage = new std::map<int, T>();  
              ^

In file included from /usr/local/include/c++/5.1.0/map:61:0,  
       from main.cpp:1:  
/usr/local/include/c++/5.1.0/bits/stl_map.h:96:11: note: provided for 'template<class _Key, class _Tp, class _Compare, class _Alloc> class std::map'  
    class map  
     ^
+0

Solo per essere sicuri: stai usando 'gcc' o' g ++ '? L'ho mescolato una volta troppo spesso ... – atlaste

+0

@atlaste g ++ 4.9.2 non compila anche questo. –

+0

MSVC13 lo compila senza errori. Quindi sembra essere un errore – Christophe

risposta

3

Questo è un altro esempio del problema descritto in Core issue 325 (vedere le "Note della riunione di agosto 2011" che hanno un esempio molto simile), ovvero la virgola nell'argomento modello lista provoca un errore di analisi quando il compilatore tenta di determinare dove si trova la fine dell'espressione.

Il problema è ancora aperto, ma il consenso del comitato è che dovrebbe essere fatto funzionare (non so cosa verrà modificato per renderlo valido però).

Clang ha implementato una soluzione alternativa per un po 'di tempo (forse tentativamente analizzando l'espressione e riprovando se fallisce) e Nathan Sidwell ha appena un-suspended the relevant G++ bug and assigned it to himself quindi spero che abbia intenzione di risolverlo presto.

+0

problema principale 325 sembra essere sugli argomenti predefiniti – sp2danny

+0

@ sp2danny, continua a leggere, vedere le "Note della riunione di agosto 2011" che hanno un esempio molto simile –

3

Interessante, dovrebbe funzionare IMO.

Questo si compila:

#include <map> 

template <typename T> 
struct X { 
    typedef std::map<int, T> mt; 
    mt *storage = new mt(); 
}; 

int main() { 
     X<int> x; 
} 

A quanto pare qualcosa va storto con l'espansione modello di argomento ...

Compilare con:

g++ -o test test.cpp -std=c++11 
Problemi correlati