2013-02-06 6 views
6

Questo codice unexplicably non può essere compilato:C++ argomento modello di funzione con il tipo struct su modelli woes

struct sometype 
{ 
    template <typename T> 
    T* get() { return nullptr; } 
}; 

template <typename T> 
struct anothertype 
{ 
#if 1 
    template <typename T2> struct some_wrapper { typedef T2 type; }; 
    typedef typename some_wrapper<sometype>::type thetype; 
#else 
    typedef sometype thetype; 
#endif 
    typedef thetype* Ptr; 

    Ptr m_ptr; 
    T* get() { return m_ptr->get<T>(); } 
}; 

Se cambio l'argomento #if-0, è in qualche modo risolto. Qualcuno può far luce in questo? Si prega di notare che la cosa apparentemente inutile some_wrapper effettivamente fa qualcosa di utile nel mio codice reale.

sto usando g ++ 4.7.1 con -fstd=gnu++11, l'errore è la seguente (indicando la linea in cui dichiaro anothertype<T>::get:

error: expected primary-expression before '>' token 
error: expected primary-expression before ')' token 
+0

Se si esegue esattamente il codice che è stato inviato tramite il compilatore, si ottiene questo errore? –

+0

@ DavidRodríguez-dribeas http://ideone.com/N8dQoj (esattamente il codice della domanda) – leemes

risposta

6

si dovrebbe risolvere la vostra chiamata di funzione come segue, aggiungendo la parola chiave template:

T* get() { return m_ptr->template get<T>(); } 

È possibile controllare this link per una spiegazione della sintassi.

8

E 'difficile dire con tutti i typedef, ma mi piacerebbe scommessa è necessario:

m_ptr->template get<T>(); 
+0

+1 per essere il primo. –

+0

Ma ... perché? 'm_ptr' è * sempre *' sometype * '. – ipc

+1

@ipc ha '#if 1' che sarà vero, quindi' m_ptr' è un 'typename some_wrapper :: type *', un tipo dipendente –