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.

Función especializada de miembro para argumento de plantilla integral con c++17.

Estoy intentando usar las plantillas std::enable_if_t y std::is_integral_v para especializar una función miembro de una clase. Leí esto, pero es sobre funciones comunes en lugar de una función miembro.

Imité y escribí mi código como sigue, pero NO funciona.

namespace oct {

class Class1 {
    template< typename T> T memf();
};

template< typename T>
std::enable_if_t< std::is_integral_v<T>, T> Class1::memf() {
    std::cout << "Integral." << std::endl;
    return 1;
};

template< typename T>
std::enable_if_t < ! std::is_integral_v<T>, T > Class1::memf() {
    std::cout << "No Integral." << std::endl;
    return T {};
};

};

Mensaje de error de compilación:

ninguna declaración coincide con ‘std::enableift<isintegralv, T>
oct::Class1::memf()

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error sugiere que no hay una declaración coincidente para la plantilla de función std::enable_if_t <><t>, T> oct::Class1::memf(). Esto se debe probablemente al hecho de que las dos especializaciones de plantilla tienen tipos de retorno en conflicto (T y T &, respectivamente) y por lo tanto no pueden utilizarse para especializar la misma plantilla de función.

    Para solucionar este problema, puede cambiar el tipo de retorno de la segunda especialización para que coincida con la primera especialización:

    namespace oct {
    
    class Class1 {
        template <typename t=""> T memf();
    };
    
    template <typename t="">
    std::enable_if_t<><t>, T> Class1::memf() {
        std::cout << "Integral." << std::endl;
        return 1;
    };
    
    template <typename t="">
    std::enable_if_t<!std::is_integral_v<T>, T> Class1::memf() {
        std::cout << "None-Integral." << std::endl;
        return T{}; // use T as return value
    };
    
    };
    

    Esto asegura que ambas especializaciones tengan el mismo tipo de retorno y debería permitir que el código se compile correctamente.

Comments are closed.