Вложенные классы шаблонов с указателем на метод, не скомпилированный в clang++
SSCCE моей проблемы:
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()
{
}
Этот код скомпилирован в gcc, но не с ошибкой:
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()
~~~~~~~~~~~~~~~~~~~~~~~~~^
в clang++. Почему?
В определении класса вызова решает проблему, я знаю. Любые шаблоны без указателя к методу отлично работают везде. Эксперименты с шаблоном /typename не имеют результата.
Ответы
Ответ 1
Возможное обходное решение: рассмотрите возможность использования std:: function вместо оболочки. Это не совсем то же самое (меньше ограничений на то, какие указатели на функции приемлемы), но он будет компилироваться на clang++ и упростить ваш код.
#include <functional>
template <class T> class MyClass
{
typedef std::function<void(void) const > wrapper;
};
Ответ 2
Вы можете перенести реализацию метода в определение класса:
template <class T> class MyClass
{
template <void (MyClass::*M)() const> struct wrapper
{
virtual void call(){/* move implementation here */};
};
};