7

関数テンプレートの特殊化のアドレスを通常のテンプレート関数に渡すのに問題はありません。

template <typename T>
void f(T) {}

template <typename A, typename B>
void foo(A, B) {}

int main()
{
    foo(&f<int>, &f<float>);
}

ただし、同じ特殊化を可変個引数テンプレートに渡そうとすると、次のようになります。

template <typename T>
void f(T) {}

template <typename... A>
void bar(A...) {}

int main()
{
    bar(&f<int>, &f<float>);
}

GCCで次のコンパイラエラーが発生します(4.6.1と4.7.0を試しました)。

test.cpp: In function 'int main()':
test.cpp:9:27: error: no matching function for call to 'bar(<unresolved overloaded function type>, <unresolved overloaded function type>)'
test.cpp:9:27: note: candidate is:
test.cpp:5:6: note: template<class ... A> void bar(A ...)
test.cpp:5:6: note:   template argument deduction/substitution failed:

なぜこれらのエラーが発生するのですか?

4

1 に答える 1

5

GCC 4.6.2で修正された可能性のあるGCCのバグのようです(まったく同じではない可能性がありますが、可変個引数テンプレート関数のアドレスを取得する必要があります)。

于 2011-09-12T21:55:52.980 に答える