'variable' 不是类型 'pointer to member function' 的有效模板参数
'variable' is not a valid template argument for type 'pointer to member function'
我对C++和模板都很陌生,我正在尝试调整一个可以用来从成员函数中进行委托的助手类。
我更改了这个代码(编译):
Delegate<void, int, int>* cheaty(void (Renderer::*method)(int, int), Renderer* obj)
{
auto maker = DelegateMaker<Renderer, void, int, int>();
return maker.BindPointer<&Renderer::MoveCamera>(obj);
}
对此:
Delegate<void, int, int>* cheaty(void (Renderer::*method)(int, int), Renderer* obj)
{
auto maker = DelegateMaker<Renderer, void, int, int>();
return maker.BindPointer<method>(obj);
}
它不编译,并给出以下错误:error: 'method' is not a valid template argument for type 'void (Engine::Renderer::*)(int, int)'
。是不是因为C++模板的限制,我试图实现的目标根本不可能实现?还是我只是错过了一些显而易见的东西?
编辑:理想情况下,我想要的是这样一个函数:
template<typename T, typename return_type, typename... params>
Delegate<return_type, params...>* make_delegate_pointer(return_type (T::*name)(params...), T* obj)
{
DelegateMaker<T, return_type, params...> maker = DelegateMaker<T, return_type, params...>();
return maker.BindPointer<name>(obj);
}
然后像这样调用它auto delegate = Delegates::make_delegate_pointer(&Class::Method, &classInstance);
Only,我一直遇到的问题是,像这样调用BindPointer maker.BindPointer<&Class::Method>(classInstance);
和像这样调用maker.BindPointer<return_type (Class::*)(arguments...)>(classInstance);
之间似乎有一些区别。
然而,return_type (T::*)(params...) memberFuncPointer = &Class::Method
编译良好。这意味着从逻辑上讲,maker.BindPointer<return_type (T::*)(params...)>(classInstance)
也应该编译(或者是它的一些变体,这就是为什么在最初的问题中我试图使用method
作为void (Renderer::*method)(int, int)
)。但事实并非如此。
模板参数值必须在编译时已知,但您的method
值直到运行时才知道,因为cheaty()
不知道传递给它的是Renderer
的哪种方法。因此编译器出错。您必须更改BindPointer
才能不再使用模板。此外,DelegateMaker
已经知道方法签名,因此不需要将该信息复制为BindPointer()
中的模板参数,让它继承DelegateMaker
中的值。
例如(未经测试,可能需要一些调整,但您应该了解大致想法):
template <typename ReturnType, typename... ParamTypes>
class Delegate
{
public:
virtual ReturnType Invoke(ParamTypes... params) = 0;
};
template <typename ClassType, typename ReturnType, typename... ParamTypes>
class DelegateMaker
{
public:
typedef ReturnType (ClassType::*MethodType)(ParamTypes... params);
private:
class DelegateImpl : public Delegate<ReturnType, ParamTypes...>
{
private:
ClassType* _obj;
MethodType _method;
public:
DelegateImpl(ClassType *obj, MethodType method)
: _obj(obj), _method(method)
{
}
virtual ReturnType Invoke(ParamTypes... params)
{
return (_obj.*_method)(params);
}
};
public:
Delegate<ReturnType, ParamTypes...>* BindPointer(MethodType method, ClassType *obj)
{
return new DelegateImpl(obj, method);
}
};
template <typename ClassType, typename ReturnType, typename... ParamTypes>
Delegate<ReturnType, ParamTypes...>* make_delegate_pointer(
DelegateMaker<ClassType, ReturnType, ParamTypes...>::MethodType method,
ClassType* obj)
{
DelegateMaker<ClassType, ReturnType, ParamTypes...> maker;
return maker.BindPointer(method, obj);
}
auto delegate = Delegates::make_delegate_pointer(&Class::Method, &classInstance);
- 我如何知道作为参数的size_t在函数中是否有效?
- "std::shared_ptr":不是参数"_Ty"的有效模板类型参数
- 为什么模板参数中的双冒号有效?
- 函数参数的名称与调用函数时使用的变量相同是否有效?
- 为什么使用不匹配的参数调用重载函数仍然有效
- C++/11 auto 关键字是在更有效时推导参数进行按引用传递,还是始终按值传递?
- 仅当一个参数中未使用 std::function 时,模板函数替换才有效
- 自动模板类enable_if有效参数
- 带有"up-"和"center-vec3"参数的glm::rotate()的有效替代方案?
- 为什么重写方法并将 const 添加到参数类型有效
- 字符串或const char*,更有效地用作构造函数参数
- 在 pthread_create() 中使用局部变量作为参数有效吗?
- 如何有效地传递 std::vector<cv::P oint3f> 的子向量作为参数(不拥有函数)
- 作为模板非类型参数的 C 字符串在 gcc 6.3 中有效,但在 Visual Studio 2017(x64 为 19
- 如果 null 不是有效值,则使参数成为引用而不是指针
- Qt C++ - 创建 QList<Myclass> - 不是参数 'T 的有效模板类型参数
- 如何以有效的方式将输入参数传递给函数
- C++17 有效地将参数包参数与 std::array 元素相乘
- GLFW 错误 - GLFWwindow* 未被识别为有效参数
- 配置文件上——host参数的有效参数列表