c++ - reales - libro de android studio en español pdf
Llamando a la función de plantilla dentro de la clase de plantilla (3)
¿Podría ser este un caso de foo.template bar‹ double >
?
Descargo de responsabilidad: la siguiente pregunta probablemente sea tan fácil que me sorprenda ver la primera respuesta. Además, quiero disculparme por cualquier pregunta duplicada: los problemas sintácticos no siempre son fáciles de identificar, sino una explicación verbal, por lo que buscarlos no es tan fácil ...
Pero basta de eso. Tengo dos clases con plantilla, una de ellas tiene una función miembro con plantilla, la otra clase intenta llamar a esa función. A continuación se muestra un ejemplo mínimo de producción de errores:
#include <iostream>
template <typename T>
class Foo {
public:
Foo() {
}
template <typename outtype>
inline outtype bar(int i, int j, int k = 1) {
return k;
}
};
template <typename T>
class Wrapper {
public:
Wrapper() {
}
double returnValue() {
Foo<T> obj;
return obj.bar<double>(1,2); // This line is faulty.
}
};
int main() {
Wrapper<char> wr;
double test = wr.returnValue();
std::cout << test << std::endl;
return 0;
}
En tiempo de compilación, esto resulta en
expected primary-expression before ''double''
expected '';'' before ''double''
expected unqualified-id before ''>'' token
donde todos los mensajes de error se dirigen al enlace marcado en el código.
Ya te agradezco por tus ideas, no importa lo obvias que sean.
Como a menudo: una vez que se publicó la pregunta, la respuesta vino por sí sola. Corrigiendo la línea defectuosa para
return obj.template bar<double>(1,2);
Da los resultados esperados.
Gracias por leer...
obj.bar<double>(1,2); // This line is faulty.
Aquí se requiere la palabra clave de la template
, ya que obj
es una instancia de un tipo Foo<T>
que depende del parámetro de la plantilla T
, por lo que lo anterior debe escribirse como:
obj.template bar<double>(1,2); //This line is corrected :-)
Lea la respuesta de @ Johannes aquí para una explicación detallada: