嵌套模板类,指针指向方法未在clang ++中编译

时间:2015-07-29 21:58:34

标签: c++ templates gcc 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 ++中。的为什么吗

在课堂上调用定义解决了这个问题,我知道。任何非指针方法模板都可以在任何地方正常工作。 template / typename 的实验没有结果。

2 个答案:

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