La especialización de plantillas de funciones miembro con un tipo genérico en C++, por ejemplo std::vector, no compila.
Tengo un problema con la especialización de una función miembro de una estructura genérica.
Mi objetivo es especializar la función miembro Run de Bar con todo tipo de std::vector
#include <iostream>
#include <vector>
// (1) compilar
template <typename T>
struct Foo {
T Run() {
std::cout << "Foo no especializado" << std::endl;
return T();
};
};
// (2) compilar
template <typename T>
struct Foo<std::vector<T>> {
std::vector<T> Run() {
std::cout << "Foo especializado" << std::endl;
return std::vector<T>();
};
};
template <typename T> struct Bar
{
T Run();
};
// (3) compilar
template<typename T>
T Bar<T>::Run() {
std::cout << "Bar no especializado" << std::endl;
return T();
};
// (3) compilar
template<>
std::vector<bool> Bar<std::vector<bool>>::Run() {
std::cout << "Bar especializado" << std::endl;
return std::vector<bool>();
};
// (4) no compilará: error: uso no válido de un tipo no completo 'struct Bar<std::vector<T> >
template<typename T>
std::vector<T> Bar<std::vector<T>>::Run() {
std::cout << "Bar especializado" << std::endl;
return std::vector<T>();
};
int main(int argc, char const *argv[]) {
Foo<bool> f1;
bool rf1 = f1.Run();
Foo<std::vector<int>> f2;
std::vector<int> rf2 = f2.Run();
Bar<bool> b1;
bool rb1 = b1.Run();
Bar<std::vector<bool>> b2;
std::vector<bool> rb2 = b2.Run();
Bar<std::vector<int>> b3;
std::vector<int> rb3 = b3.Run();
return 0;
};
No compilará si comento la línea 4, ¿hay alguna manera de hacer que esto funcione? Gracias de antemano.
Demo que no compila: http://cpp.sh/7zk5q
Demo que compila: http://cpp.sh/6murrj
davy.ai
Para especializar la función miembro Run de Bar con todo tipo de std::vector, necesitas declarar la especialización de la plantilla de Bar antes de especializar la función miembro.
En este caso, necesitas agregar el siguiente código antes de la definición de la función miembro especializada:
Luego, puedes definir la función miembro especializada de la siguiente manera:
Esto debería resolver el error de compilación y permitirte especializar la función miembro Run de Bar con todos los tipos de std::vector.