Подтвердить что ты не робот

Вложенные классы шаблонов с указателем на метод, не скомпилированный в 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 не имеют результата.

4b9b3361

Ответ 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 */};
    };
};