2012-03-23 31 views
7

Sono in difficoltà con il seguente codice. Fondamentalmente, ho una classe Foo e una classe nidificata, e ora voglio passare un puntatore dell'oggetto Class Bar a una funzione, ma non lo compila. Qualcuno può aiutarmi con questo? Grazie.Funzione template C++ che accetta la classe template come parametro

template <typename T> 
struct Foo 
{ 
    struct Bar 
    { 
     T data_; 
    }; 
    Bar bar_; 
}; 

template <typename T> 
void func(Foo<T>::Bar* bar) // Why is this line wrong??? 
{ 
} 

int main() 
{ 
    Foo<int> foo; 
    foo.bar_.data_ = 17; 
    func(&foo.bar_); 
    return 0; 
} 
+0

possibile duplicato del [C++, argomento di un template non può essere dedotto] (http://stackoverflow.com/questions/6060824/c-template-argument-can -not-be-deduced) –

+0

(almeno, un duplicato una volta risolto il problema ovvio di 'typename', che VC++ probabilmente lascerebbe scivolare come al solito comunque) –

risposta

14

È necessario avere la seguente firma

template <typename T> 
void func(typename Foo<T>::Bar* bar) // Why is this line wrong??? 

Tuttavia, questo non è l'unico problema

func(&foo.bar_); 

deve anche essere

func<int>(&foo.bar_); 

Questo perché si sta chiamando la funzione template "func", ma il suo tipo non può essere dedotto. Senza il suo tipo, darà un errore come

no matching function for call to 'func(Foo<int>::Bar*)' 
+2

+1. Risposta corretta. Il problema più grande è: "T" non può essere dedotto, quindi deve essere passato esplicitamente. – Nawaz

+2

+1 Mi piacciono i nuovi arrivati ​​che danno risposte "profonde"! Per tua informazione il fatto che 'T' non può essere dedotto qui è noto come ** contesto non deducibile **. –

3

E 'un dependent name, è necessario dire:

template <typename T> 
void func(typename Foo<T>::Bar* bar) // Tell the compiler explicitly it's a type 
+2

La cura di Downfer è un commento? – Flexo

+0

-1. Questa risposta è incompleta e non risolve il problema più grande nella domanda. Quello che hai detto è vero, ma come funzionerebbe 'func (& foo.bar_)' Ancora non lo sarebbe. – Nawaz

+0

@ Nawaz: Si prega di vedere la mia risposta – josephthomas

Problemi correlati