質問: (int)-sqrt(pow(r, 2) - pow(x - a, 2)) + b;←98行目 1>c:\documents and settings\rei\my documents\visual studio 2008\projects\setpixel01\setpixel01\setpixel01.cpp(96) : error c2668: 'pow' : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照) 1> c:\program files\microsoft visual studio 9.0\vc\include\math.h(575): 'long double pow(long double,int)' の可能性があります。 1> c:\program files\microsoft visual studio 9.0\vc\include\math.h(527): または 'float pow(float,int)' 1> c:\program files\microsoft visual studio 9.0\vc\include\math.h(489): または 'double pow(double,int)' 1> 引数リスト '(int, int)' を一致させようとしているとき 同じ内容のエラーが96行目なのが2回、98行目なのが2回出ます。math.hを編集すればいいんでしょうか?gccならコマンドラインから-lmでいいかもしれないんですが。自分の入力ミスはないと思います。 どなたかお分かりになる方、教えていただけないでしょうかm(_ _)m
回答: そのエラーに書いてある通りです。 c++では、同じ関数名でも、引数の型や数によって、違う関数として定義できる機能があります。(オーバーロードといいます) cでは、powは pow(double,double)だけであって、どんな型を指定しても、doubleに型変換してくれました。 しかし、c++では http://msdn.microsoft.com/ja-jp/library/dt5dakze.aspx これだけありますが、メッセージにあるように、 pow(int , int) と定義されているものはありません。第2引数がintのものがありますが、第1引数が3通りあり、intをどれに変換してよいのか、判断できないのです。 対処法としては ・第1引数をキャストして、曖昧さをなくす 例: pow( static_cast(r), 2) // 第1引数がdoubleになるので、 double pow(double,int)が選ばれる ・第2引数をdoubleにして、候補を1つにする 例: pow(r, 2.0) // 第2引数がdoubleになるので、 double pow(double,double)しか候補がない ・二乗くらいなら、pow関数なんて使わない。 例: r*r なお、gcc の -lm は、リンクの際にライブラリ(libm)をリンクするように指定するものです。今回のエラーはその前のコンパイルの段階で発生するものなので、 -lm 相当のことをしても無意味です。