2011-09-16 17 views
6

Sto scrivendo alcuni casi di test per C nome-di decodifica il codice ++, ed ottengo un errore di strano quando provo a compilare questo: (ciò che segue è patologicamente codice cattivo C++ che non avrei mai usare in pratica).C++ template domanda

errore
template<class U, class V> 
class TStruct 
{ 
    U u; 
    V v; 
public: 
    void setU(const U& newu) {u = newu; } 
}; 

template<class T, class U> 
class Oog 
{ 
    T t; 
    U u; 

public: 
    Oog(const T& _t, const U& _u) : t(_t), u(_u) {} 
    void doit(TStruct<T,U> ts1, TStruct<U,T> ts2, U u1, T t1) {} 

    template<class F> 
    class Huh 
    { 
     F f; 
    public: 

     template<class V> 
     class Wham 
     { 
      V v; 
     public: 
      Wham(const V& _v) : v(_v) {} 
      void joy(TStruct<T,V> ts1, U u, F f) {} 
     }; 
    }; 
    int chakka(const Huh<T>::Wham<U>& wu, T t) {} // error here 
}; 

è la seguente:

"typetest.cpp", line 165: error: nontype "Oog<T, U>::Huh<F>::Wham [with F=T]" 
    is not a template 

Tutte le idee come posso risolvere?

risposta

7

La linea corretta dovrebbe essere come,

int chakka(const typename Huh<T>::template Wham<U>& wu, T t) ... 
    it's a type ^^^^^^^^   ^^^^^^^^ indicate that 'Wham' is a template 

[Nota: g++ is quite helpful in this case :)]

+1

grazie! Sapevo di 'typename', ma non avevo idea che dovessi usare la parola chiave' template' in quel modo. –

+0

+1: un'altra buona risposta! Questo è almeno il doppio di questa settimana! : D –

+0

@Tomalak, dai il commento di "buona risposta" e poi riprendi il tuo voto/commento dopo che qualcuno lo ha bloccato !! – iammilind

2

Hai bisogno di dirgli che il membro Wham di Huh sarà un modello:

const Huh<T>::template Wham<U> & 
+1

Ti manca ancora 'typename' (almeno [gcc complains] (http://www.ideone.com/jjasO)). – iammilind

+1

@iammilind Sì, non mi era venuto in mente. Dovevo fissare la tua risposta per un po 'prima di essere sicuro che fosse necessario. –

-1

Questo dovrebbe essere sufficiente (i tipi dipendenti causano problemi)

int chakka(const typename Huh<T>::Wham<U>& wu, T t) {}

+0

Non lo è. Arrivarci, comunque! (Dovresti provare la tua risposta prima di postarla) –

+0

Hm .. In realtà l'ho provato. Presumo che solo VS 2010 non abbia bisogno della parola chiave 'template'. – Werolik

+1

Si prega di provare in VS 2010 prima del downvoting nextr. – Werolik