関数テンプレートの専門化をバリアードテンプレート関数に合格します
-
29-10-2019 - |
質問
関数テンプレートの専門化のアドレスを通常のテンプレート関数に渡すのに問題はありません。
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:
なぜこれらのエラーが発生しているのですか?
解決
それがあるように見えます GCC 4.6.2でおそらく修正されているGCCのバグ (おそらく、それはまったく同じではないが、バリアードテンプレート関数のアドレスを取得することを伴うからです)。
所属していません StackOverflow