template plantillas plantilla funciones curso con clase c++ templates gcc clang++

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 */}; }; };