私はC++Templates Complete Guideを読んでいて、この非型関数テンプレートパラメーターコードに出くわしました(関数定義と呼び出しを除くmain()と他の部分を追加しました):
#include <vector>
#include <algorithm>
#include <iostream>
template <typename T, int value>
T add (T const & element){
return element + value;
}
int main() {
int a[] = {1,2,3,4};
int length = sizeof (a) / sizeof (*a);
int b[length];
std::transform (a, a + length, b, (int(*)(int const &))add <int, 5>); //why?
std::for_each (b, b + length, [](int const & value){ std::cout << value << '\n'; });
return 0;
}
本を読んだ後、なぜ関数呼び出しの型キャストが必要なのか理解できませんでしたか?
編集:本からの説明:
addは関数テンプレートであり、関数テンプレートは、オーバーロードされた関数のセットに名前を付けると見なされます(セットにメンバーが1つしかない場合でも)。ただし、現在の標準によれば、オーバーロードされた関数のセットをテンプレートパラメータの推定に使用することはできません。したがって、関数テンプレート引数の正確なタイプにキャストする必要があります:...
コンパイラ:Ubuntu10.10のg++ 4.5.1