0

次のコードは G++ ではコンパイルできません (ただし、そうすべきだと思います)。

#include <iostream>

template <unsigned N>
struct foo_traits {
    typedef const char ArrayArg[N];
    typedef int Function (ArrayArg *);
};

template <unsigned N>
int foo (typename foo_traits<N>::Function *ptr) {
    return ptr(&"good");
}

int bar (const char (*x)[5]) {
    std::cout << *x << "\n";
    return 0;
}

int main ()
{
    return foo(bar);
}

これを GCC 4.4 から 4.7 で確認したところ、テンプレートの引数推定エラーが発生しました。4.7.1 の場合:

prog.cpp: In function ‘int main()’:
prog.cpp:21:19: error: no matching function for call to ‘foo(int (&)(const char (*)[5]))’
prog.cpp:21:19: note: candidate is:
prog.cpp:10:5: note: template<unsigned int N> int foo(typename foo_traits<N>::Function*)
prog.cpp:10:5: note:   template argument deduction/substitution failed:
prog.cpp:21:19: note:   couldn't deduce template parameter ‘N’

明示的なテンプレート引数 (つまり、foo<5>(bar)) を使用すると、正常にコンパイルされます。sなしでコードのバージョンを使用すると、正常にtypedefコンパイルされます。

#include <iostream>

template <unsigned N>
int fixfoo (int (*ptr) (const char (*)[N])) {
    return ptr(&"good");
}

int bar (const char (*x)[5]) {
    std::cout << *x << "\n";
    return 0;
}

int main ()
{
    return fixfoo(bar);
}

失敗したコードはコンパイルされるはずですか (つまり、ばかげた間違いを犯したのでしょうか)。

4

1 に答える 1

2
int foo(typename foo_traits<N>::Function *ptr);

シグネチャはそれを演繹不可能なコンテキストにするため、テンプレート引数を含めて、値を認識し、結果としてポインターの型も認識できるようにする必要があります。Nptr

2 番目の例は、署名の型をbar推測できるためコンパイルされます。

于 2013-06-10T21:16:56.350 に答える