我试图将函数作为参数传递给模板类-目的是让我可以将任何函数作为参数传递并实现不同的功能:
int A()
{
return 0;
}
void Test() {
auto B2 = B<int(*A)()>(&A);
}
int main()
{
Test();
}
但是我遇到编译问题:
$ c++ -std=c++14 try.cpp
try.cpp: In function 'void Test()':
error: cast from 'int (*)()' to 'int' loses precision [-fpermissive]
auto B2 = B<int(*A)()>(&A);
^ ^
如何用任何返回类型的函数实例化B类并接受任何参数并解析编译?
答案 0 :(得分:4)
您应该在行A
的模板参数中删除函数名称auto B2 = ...
,如下所示:
auto B2 = B<int(*)()>(A);
名称不是类型说明符的一部分,并且类型是编译器在尝试实例化类模板时唯一要查找的内容。您可以使用此代码段引用该函数的名称,并让编译器推断其类型:
auto B2 = B<decltype(&A)>(A);
请注意,将&
传递给A
的构造函数时,可以选择将B
放在decltype(&A)
之前(尽管不适用于event.stopPropagation()
),因为它是隐式的转换为函数指针。
答案 1 :(得分:2)
函数名称不是函数指针类型的一部分。
此行:
auto B2 = B<int(*)()>(&A);
应为:
{{1}}