错误:参数打包类模板中类模板的参数过多

问题描述

我创建了一个主要模板和两个特化:一个用于 void 类型,另一个是用于不同参数类型的参数包。

后台一个“连接”引擎,连接返回void的成员函数,所以我不需要返回类型,只需要参数类型。 这些类就像包装器一样,提供了一个语法友好的静态函数来创建具体的链接

所以我的代码是这样的:


  /**
   * CalleeCreator class,primary template
   */
  template <typename T> class CalleeCreator;

  template <typename... TParams>
  class CalleeCreator<TParams...> final
  {
    public:
      template <typename TObject,void(TObject::*Function)(TParams...)>
      constexpr static void create(const char*name,TObject& instance)
      {
        new Callee< void (TObject::*)(TParams...),Function>( name,instance);
      }
  };

  template <>
  class CalleeCreator<void> final
  {
      template <typename TObject,void(TObject::*Function)(void)>
      constexpr static void create(const char* name,TObject& instance)
      {
        new Callee< void (TObject::*)(void),instance);
      }
  }; 

只要我这样调用

CalleeCreator<uint8_t,uint16_t>::create<Object,&Object::method> ("test",*this);

我收到编译错误错误类模板的参数太多

打电话时

CalleeCreator<void>::create<Object,*this);

按预期工作

我不明白的是,我创建了另一个具有返回类型和相同主模板的版本:

  template <typename TReturn,typename... TParams>
  class CalleeCreator<TReturn(TParams...)> final
  {
    public:
      template <typename TObject,TReturn(TObject::*Function)(TParams...)>
      constexpr static void create(ConstCharPtr name,TObject& instance)
      {
          new Callee< TReturn (TObject::*)(TParams...),instance);
      }
  };

  template <typename TReturn>
  class CalleeCreator<TReturn(void)> final
  {
    public:
      template <typename TObject,TReturn(TObject::*Function)(void)>
      constexpr static void create(ConstCharPtr name,TObject& instance)
      {
          new Callee< TReturn (TObject::*)(void),instance);
      }
  };

如果我打电话给他们,一切都会好起来的:

CalleeCreator<void(uint8_t,uint16_t)>::create<Object,*this);

我不明白我在这里做错了什么。

另外,Callee 类可以查看模板和构造函数


/** Class Callee,primary
 */
template <typename T,T> class Callee;


template <typename TObject,typename... TParams,void (TObject::*Function)(TParams...)>
class Callee<void (TObject::*)(TParams...),Function> final
{
  public:
    Callee(const char* name,TObject& instance){}
};

当然还有一个 Callee 类,它也有其他解决方案的返回类型。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)