2012-03-23 29 views
7

Estoy luchando con el siguiente código. Básicamente, tengo una clase Foo y una barra de clases anidadas, y ahora quiero pasar un puntero del objeto Bar de clase a una función, pero no compila. ¿Podría alguien ayudarme con esto? Gracias.Función de plantilla C++ tomando clase de plantilla como parámetro

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

posible duplicado de [C++, argumento de plantilla no puede deducirse] (http://stackoverflow.com/questions/6060824/c-template-argument-can -no se puede deducir) –

+0

(al menos, un duplicado una vez soluciona el problema obvio 'typename', que VC++ probablemente dejaría pasar como de costumbre) –

Respuesta

14

Usted necesita tener la siguiente firma

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

Sin embargo, ese no es el único problema

func(&foo.bar_); 

también necesita ser

func<int>(&foo.bar_); 

Esto se debe a que está llamando la función de plantilla "Func", pero su tipo no puede deducirse. Sin su tipo, se le dará un error como

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

+1. Respuesta correcta. El problema más grande es: 'T' no se puede deducir, por lo que debe pasarse explícitamente. – Nawaz

+2

+1 ¡Me gustan los recién llegados dando respuestas "profundas"! FYI el hecho de que 'T' no se pueda deducir aquí se conoce como ** contexto no deducible **. –

3

Es un dependent name, que necesita decir:

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

¿A quién le importa este comentario? – Flexo

+0

-1. Esta respuesta es incompleta y no resuelve el problema más grande en la pregunta. Lo que dijiste es cierto, pero ¿cómo funcionaría 'func (& foo.bar_)'? Todavía no lo haría. – Nawaz

+0

@ Nawaz: Por favor, consulte mi respuesta – josephthomas

Cuestiones relacionadas