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

dyo*_*mas 23 c++ gcc templates 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()
{
}
Run Code Online (Sandbox Code Playgroud)

此代码在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()
 ~~~~~~~~~~~~~~~~~~~~~~~~~^
Run Code Online (Sandbox Code Playgroud)

在clang ++中.为什么?

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

alw*_*ent -2

您可以在类定义中移动方法的实现:

template <class T> class MyClass
{
    template <void (MyClass::*M)() const> struct wrapper
    {
        virtual void call(){/* move implementation here */};
    };
};
Run Code Online (Sandbox Code Playgroud)

  • 参见上文:_在类中调用定义解决了问题,我知道_ (2认同)