// コンパイルエラーが起きるソース

int n = 10;

double x;

x = sqrt(n);

 

このようなソースをコンパイルした場合,次のようなコンパイルエラーが起きることがあります.

c:\Temp\kisopro\test.cpp(6): error C2668: 'sqrt' : オーバーロード関数の呼び出しを解決することができません。

 

この場合,次のようにソースを書き換えることでコンパイルエラーを防ぐことができます.

// コンパイルエラーが起きないソース

int n = 10;

double x;

x = sqrt(n * 1.0);   // nに1.0を乗算する

 

 

【解説】

 

このエラーはsqrt()関数がdouble, floatなどの浮動小数点の値の平方根を求めるように実装されているため起きます.上のプログラムでは変数nが整数型であるため,そのままでは平方根を求められないという趣旨でエラーになります.1.0を乗算するという無意味な演算を入れてやることにより,整数型から浮動小数点型に変換されるため,このエラーが起きなくなります.

 

なお,旧バージョンのVisual Studio.NETでは,この変換が自動で行われたため,このエラーは起きませんでした.Visual Studio.NET 2003以降で生じるエラーのようです.

 

ちなみに,下記のようなソースでもエラーを防ぐことができます.

x = sqrt(n / 1.0);        // 1.0で割る

x = sqrt((double) n);    // キャスト(double)を用いる.これはnをdouble型に変換するという意味です.