plantillas - template typename t c++
Clases de plantillas anidadas con puntero a método no compiladas en clang++ (2)
Posible solución: considere usar std :: function en lugar de envoltorio. No es exactamente lo mismo (menos restricción sobre qué punteros de función son aceptables) pero se compilará en clang ++ y simplificará su código.
#include <functional>
template <class T> class MyClass
{
typedef std::function<void(void) const > wrapper;
};
SSCCE de mi problema es:
template <class T> class MyClass
{
template <void (MyClass::*M)() const> struct wrapper
{
virtual void call();
};
};
template <typename T>
template <void (MyClass<T>::*M)() const>
void MyClass<T>::wrapper<M>::call()
{
}
Este código compilado en gcc pero falló con error:
error: nested name specifier ''MyClass<T>::wrapper<M>::'' for declaration does not refer into a class, class template or class template partial specialization
void MyClass<T>::wrapper<M>::call()
~~~~~~~~~~~~~~~~~~~~~~~~~^
en clang ++. ¿Por qué?
En la definición de la llamada de clase resuelve el problema, lo sé. Cualquier plantilla que no sea de puntero a método funciona bien en todas partes. Los experimentos con template / typename no tienen ningún resultado.
Puede mover la implementación del método en la definición de clase:
template <class T> class MyClass
{
template <void (MyClass::*M)() const> struct wrapper
{
virtual void call(){/* move implementation here */};
};
};