错误不在第 d 行,而是在您使用了链接规范(the extern "C")
根据第7.5.4节:
链接规范应仅出现在命名空间范围内
这意味着您可以将您的函数移到全局命名空间中,这对于 C 函数很常见:
typedef int (*pfun)(int); // line a
extern "C" void foo(pfun); // line b
extern "C" int g(int); // line c
int main()
{
foo(g); // line d
return 0;
}
或者在命名空间内:
namespace c_funcs
{
typedef int (*pfun)(int); // line a
extern "C" void foo(pfun); // line b
extern "C" int g(int); // line c
}
int main()
{
c_funcs::foo(c_funcs::g); // line d
return 0;
}
...但不在函数范围内,就像您的代码所做的那样。
链接规范嵌套,所以你甚至可以做一些奇怪的事情来给出foo和g“C”链接:
typedef int (*pfun)(int); // line a
extern "C" int main()
{
void foo(pfun); // line b
int g(int); // line c
foo(g); // line d
return 0;
}