エラーは行 d にはありませんが、リンケージ仕様( 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;
}