私はC++テンプレートを読んでいます:完全なガイドブックと第4章(4.2非型関数テンプレートパラメーター)は、コレクションの各要素に値を追加するためにSTLコンテナーで使用できるテンプレート関数の例です。完全なプログラムは次のとおりです。
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
template<typename T, int VAL>
T addValue(T const& x)
{
return x + VAL;
}
int main()
{
std::vector<int> source;
std::vector<int> dest;
source.push_back(1);
source.push_back(2);
source.push_back(3);
source.push_back(4);
source.push_back(5);
std::transform(source.begin(), source.end(), dest.begin(), (int(*)(int const&)) addValue<int, 5>);
std::copy(dest.begin(), dest.end(), std::ostream_iterator<int>(std::cout, ", "));
return 0;
}
本が次のように述べているので、私はその醜いキャストを作らなければなりませんでした:
Note that there is a problem with this example: addValue<int,5> is a function template, and function templates are considered to name a set of overloaded functions (even if the set has only one member). However, according to the current standard, sets of overloaded functions cannot be used for template parameter deduction. Thus, you have to cast to the exact type of the function template argument:
std::transform (source.begin(), source.end(), // start and end of source
dest.begin(), // start of destination
(int(*)(int const&)) addValue<int,5>); // operation
私の問題は、プログラムの実行時にセグメンテーション違反が発生することです。MacでClangを使用してビルドしています。
キャストが間違っていますか、それとも他に何が問題である可能性がありますか?