C++: transform 関数での unresolved overloaded function type コンパイルエラー
G++で以下のコードをコンパイルするとエラーが発生する。
1: #include <iostream>
2: #include <deque>
3: #include <algorithm>
4: #include <cmath>
5:
6: using namespace std;
7:
8: int main() {
9: deque<double> radians(1, 3.14), sines(1);
10:
11: transform(radians.begin(), radians.end(), sines.begin(), sin);
12: cout << sines[0] << endl;
13: }
・エラー
1: error: no matching function for call to 'transform(std::deque<double>::iterator, std::deque<double>::iterator, std::deque<double>::iterator, <unresolved overloaded function type>)'
sin関数は、G++の「cmath」において以下のようにオーバーロードされている。
1: inline float
2: sin(float __x)
3:
4: inline long double
5: sin(long double __x)
6:
7: template<typename _Tp>
8: inline typename __gnu_cxx::__enable_if<__is_integer<_Tp>::__value,
9: double>::__type
10: sin(_Tp __x)
一方、transformのテンプレート引数では、テンプレート関数のsinについて推論することができない。そのため、どのsin関数を使えばいいのか分からない状態となってしまい、エラーが発生する。
以下のように、sin関数の型を指定すれば動作するようになる。
1: transform(radians.begin(), radians.end(), sines.begin(), (double(*)(double))sin);
参考:
http://2bangai.net/read/c582add4b3ec2e8b617ee5e942e57d68c6418eac78102818fd04c3cf09e42d80/301
0 件のコメント:
コメントを投稿