次のC++コードは、GNU g ++、LLVM、およびMicrosoft VC6とVC7を除いて、私がスローした他のすべてのC++コンパイラに対して正しくコンパイルおよび実行されます。
template<typename A, typename B> int HasVoidReturnType(A(*)(B)) { return 0; }
template<typename B> int HasVoidReturnType(void(*)(B)) { return 1; }
void f(double) {}
int foo() { return HasVoidReturnType(f); }
VC6およびVC7の場合、コンパイルに失敗し、エラーが発生します。
f.cpp(4) : error C2667: 'HasVoidReturnType' : none of 2 overloads have a best conversion
f.cpp(2): could be 'int HasVoidReturnType(void (__cdecl *)(B))'
f.cpp(1): or 'int HasVoidReturnType(A (__cdecl *)(B))'
while trying to match the argument list '(overloaded-function)'
f.cpp(4) : error C2668: 'HasVoidReturnType' : ambiguous call to overloaded function
f.cpp(2): could be 'int HasVoidReturnType(void (__cdecl *)(B))'
f.cpp(1): or 'int HasVoidReturnType(A (__cdecl *)(B))'
while trying to match the argument list '(overloaded-function)'
どのコンパイラが正しいかというメリットを主張するのではなく、VC6とVC7を使用して、関数がvoidリターン型を持っているかどうかをテンプレート関数からどのように判断できますか?