error: too many arguments for class template in a parameter packed class template
error: too many arguments for class template in a parameter packed class template
我创建了一个主模板和两个特化:一个用于 void 类型,另一个是用于不同参数类型的参数包。
后台是一个“连接”引擎,连接成员函数returning void,所以我不需要return类型,只需要参数类型。
classes 就像包装器一样,提供语法友好的静态函数来创建具体的 Link.
所以我的代码如下所示:
/**
* 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), Function>( name, instance);
}
};
只要我这样调用:
CalleeCreator<uint8_t, uint16_t>::create<Object,
&Object::method> ("test", *this);
我收到编译错误:错误:class 模板的参数太多 。
通话中
CalleeCreator<void>::create<Object,
&Object::method> ("test", *this);
按预期工作
我不明白的是,我创建了另一个具有 return 类型和相同主模板的版本:
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...), Function>( name, 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), Function>( name, instance);
}
};
如果我打电话给他们,一切都很好并且工作正常:
CalleeCreator<void(uint8_t, uint16_t)>::create<Object,
&Object::method> ("test", *this);
我不明白我做错了什么。
此外,被调用者class 可以查看模板和构造函数。
/** 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-class 和 return 类型用于其他解决方案。
您只需要一个主要的可变参数 class 模板:
template <typename... TParams>
class CalleeCreator final
{
// ...
};
您不需要部分特化,也不需要针对 R(void)
进行特化 - 这是一种古语(来自 C),在 C++ 中编写采用 0 个参数的函数类型的方式带有空括号。
我创建了一个主模板和两个特化:一个用于 void 类型,另一个是用于不同参数类型的参数包。
后台是一个“连接”引擎,连接成员函数returning void,所以我不需要return类型,只需要参数类型。 classes 就像包装器一样,提供语法友好的静态函数来创建具体的 Link.
所以我的代码如下所示:
/**
* 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), Function>( name, instance);
}
};
只要我这样调用:
CalleeCreator<uint8_t, uint16_t>::create<Object,
&Object::method> ("test", *this);
我收到编译错误:错误:class 模板的参数太多 。
通话中
CalleeCreator<void>::create<Object,
&Object::method> ("test", *this);
按预期工作
我不明白的是,我创建了另一个具有 return 类型和相同主模板的版本:
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...), Function>( name, 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), Function>( name, instance);
}
};
如果我打电话给他们,一切都很好并且工作正常:
CalleeCreator<void(uint8_t, uint16_t)>::create<Object,
&Object::method> ("test", *this);
我不明白我做错了什么。
此外,被调用者class 可以查看模板和构造函数。
/** 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-class 和 return 类型用于其他解决方案。
您只需要一个主要的可变参数 class 模板:
template <typename... TParams>
class CalleeCreator final
{
// ...
};
您不需要部分特化,也不需要针对 R(void)
进行特化 - 这是一种古语(来自 C),在 C++ 中编写采用 0 个参数的函数类型的方式带有空括号。