Estoy tratando de implementar una función de plantilla con identificadores anulados de manera diferente mediante la especialización de plantillas.especialización de plantillas para funciones de miembros estáticos; ¿cómo?
El siguiente código me da una "especialización explícita en el ámbito no-espacio de nombres" en gcc:
template <typename T>
static T safeGuiCall(boost::function<T()> _f)
{
if (_f.empty())
throw GuiException("Function pointer empty");
{
ThreadGuard g;
T ret = _f();
return ret;
}
}
// template specialization for functions wit no return value
template <>
static void safeGuiCall<void>(boost::function<void()> _f)
{
if (_f.empty())
throw GuiException("Function pointer empty");
{
ThreadGuard g;
_f();
}
}
He intentado moverlo fuera de la clase (la clase no se templated) y en el espacio de nombres, pero luego aparece el error "La especialización explícita no puede tener una clase de almacenamiento". He leído muchas discusiones sobre esto, pero las personas no parecen estar de acuerdo en cómo especializar las plantillas de funciones. ¿Algunas ideas?
hm He intentado lo mismo ahora, pero lo puse en un archivo .hpp y traté de incluirlo ... luego recibí el error "definición múltiple de vodi X: ff (Prueba ). No puedo ver qué haría ser la diferencia? –
Rolle
¿Fue un compilador o un error de enlazador?Si se trata de un error del compilador, significa que probablemente esté incluyendo el encabezado de la plantilla más de una vez y faltan los resguardos del encabezado, y por lo tanto la doble definición: el compilador está viendo dos definiciones (lamentablemente exactas) para la implementación. –
¿Por qué debo agregar en línea para el primer caso? Si no, recibo un error de compilación. – sop