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 ++中。的为什么吗
在课堂上调用定义解决了这个问题,我知道。任何非指针方法模板都可以在任何地方正常工作。 template / typename 的实验没有结果。
答案 0 :(得分:1)
可能的解决方法:考虑使用std :: function而不是wrapper。它不完全相同(对可以接受的函数指针的约束较少)但它将在clang ++上编译并简化代码。
#include <functional>
template <class T> class MyClass
{
typedef std::function<void(void) const > wrapper;
};
答案 1 :(得分:-2)
您可以在类定义中移动方法的实现:
template <class T> class MyClass
{
template <void (MyClass::*M)() const> struct wrapper
{
virtual void call(){/* move implementation here */};
};
};