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()
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
yT &
, 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:
Esto asegura que ambas especializaciones tengan el mismo tipo de retorno y debería permitir que el código se compile correctamente.