es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , , ,

Answer

  1. Avatar for 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:

    template <typename T> struct Bar<std::vector<T>>
    {
        std::vector<T> Run();
    };
    

    Luego, puedes definir la función miembro especializada de la siguiente manera:

    template<typename T>
    std::vector<T> Bar<std::vector<T>>::Run() {
        std::cout << "Bar especializado" << std::endl;
        return std::vector<T>();
    };
    

    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.

Comments are closed.