6.05.2011

C++: Compilation error 'unresolved overloaded function type' in std::transform

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 件のコメント:

コメントを投稿