Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过模板传递成员函数指针_C++_Function_C++11_Templates - Fatal编程技术网

C++ 通过模板传递成员函数指针

C++ 通过模板传递成员函数指针,c++,function,c++11,templates,C++,Function,C++11,Templates,我将此作为起点,并将其更新为使用varidadic模板 我还尝试创建一个createCallback函数,该函数将在一个实例中创建回调对象,但得到一个编译错误,我不完全理解 一个非常基本的可编译示例如下(为了清晰起见,我删除了回调类): 模板 类MemberCallbackFactory { 公众: 模板 内联静态无效绑定(T*o) { // } }; 模板 内联空隙 createCallback(T*obj,R(T::*Func)(P…) { MemberCallbackFactory()。模

我将此作为起点,并将其更新为使用varidadic模板

我还尝试创建一个createCallback函数,该函数将在一个实例中创建回调对象,但得到一个编译错误,我不完全理解

一个非常基本的可编译示例如下(为了清晰起见,我删除了回调类):

模板
类MemberCallbackFactory
{
公众:
模板
内联静态无效绑定(T*o)
{
//
}
};
模板
内联空隙
createCallback(T*obj,R(T::*Func)(P…)
{
MemberCallbackFactory()。模板绑定(obj);
}
课堂测试
{
公众:
无效剂量测定(int val)
{
//
}
};
int main()
{
试验t;
//作品:
MemberCallbackFactory().Bind(&t);
//生成编译错误:
createCallback(&t,&Test::doSomething);
返回0;
}
使用C++11使用gcc4.9.2编译此示例将返回:

test2.cpp:11:28: note:   template argument deduction/substitution failed:
test2.cpp:21:9: error: ‘func’ is not a valid template argument for type ‘void (Test::*)(int)’
        MemberCallbackFactory<R, T, P...>().template Bind<func>(obj);
        ^
test2.cpp:21:9: error: it must be a pointer-to-member of the form ‘&X::Y’
test2.cpp:21:9: error: could not convert template argument ‘func’ to ‘void (Test::*)(int)’
test2.cpp:11:28:注意:模板参数推断/替换失败:
test2.cpp:21:9:错误:“func”不是类型“void(Test::*)(int)”的有效模板参数
MemberCallbackFactory()。模板绑定(obj);
^
test2.cpp:21:9:错误:它必须是指向格式为“&X::Y”的成员的指针
test2.cpp:21:9:错误:无法将模板参数“func”转换为“void(Test::*)(int)”
因此,如果我将&Test::doSomething作为Func参数传递给createCallback,为什么我不能将其转发给Bind方法?它不应该是正确的类型吗


如果我将createCallback函数的一部分移到main中,它就可以正常编译。

不能将
Func
用作模板参数,因为它的计算结果不是常量表达式。同样的问题:

template<int> void foo() {}
int A = 5;
foo<A>();
模板void foo(){}
INTA=5;
foo();

宁可使用
std::function
和lambda表达式,也不要使用
std::bind
或您自己的
bind()
函数。@user0042:这是我正在考虑的一个选项。不过,我想了解这种情况下的问题是什么。在
createCallback
中,
Func
是一个参数,即可能是一个运行时值。这就是为什么你不能用它作为模板参数。谢谢你的澄清。现在完全有道理了。假期里不应该做那种事:-/
template<int> void foo() {}
int A = 5;
foo<A>();