C ++でのsqrtと倍増するには、Visual Studio 2008のコンパイラの自動キャストはしないのですか?

StackOverflow https://stackoverflow.com/questions/2452510

  •  20-09-2019
  •  | 
  •  

質問

は、コンパイラが自動的に次のように二重にキャストではないでしょうか?少なくともウォルター・サビッチに応じます。

#include <iostream>
#include <cmath>
using namespace std;

int main(){
    int k;
    for(k = 1; k <= 10; k++)
        cout << "The square root of k is: " << sqrt(k) << endl;
    return 0;
}//error C2668: 'sqrt' : ambiguous call to overloaded function
//Visual Studio 2008 on Win Vista
役に立ちましたか?

解決

問題の中から選択するsqrt 3つのバージョンがあるということです

     double sqrt (      double x );
      float sqrt (       float x );
long double sqrt ( long double x );

あなたはintに渡しているので、コンパイラは引数を促進するために起こっているが、それは上記のタイプのいずれかにあなたの整数を促進することも同様に有効ですので、それは曖昧だ。

あなたは、単に明示のように、上記のいずれかのタイプにキャストすることによってこの問題を解決することができます

cout << "The square root of k is: " << sqrt((double)k) << endl;

他のヒント

あいまいなコールエラーは、それがないのが暗黙的に変換しないことを呼び出すために機能するかわからないということです。

以下を見てください。私はダブルを取り、それは暗黙的に変換何ら問題がありませんdoubleを返す自分自身の関数を作成した場合。あなたの整数は3つのオーバーロードのいずれかに変換することができますので、それを呼び出すために何を知っていません。

double mysqrt(double d)
{
   return d;
}
using namespace std;
int main(int argc, char ** argv)
{

    int k;
    for(k = 1; k <= 10; k++)
        cout << "The square root of k is: " << mysqrt(k) << endl;
    return 0;
}//Works Fine

しかし、私は私があいまいなコールのエラーを作成floatを取るmysqrtの別のバージョンを追加します。

double mysqrt(float f)
{
    return f;
}
double mysqrt(double d)
{
    return d;
}
using namespace std;
int main(int argc, char ** argv)
{

    int k;
    for(k = 1; k <= 10; k++)
        cout << "The square root of k is: " << mysqrt(k) << endl;
    return 0;
}//error C2668: 'mysqrt' : ambiguous call to overloaded function

複数あるので SQRT機能する(過負荷)とより1それはあなたが、コンパイラが「情況」証拠に基づいて、あなたのための決定を行う必要はありませんので、良いことである(これを指定するのはあなた次第です精度を失うことなく、パラメータとしてint型を受け入れることができます - SQRTにint型を渡します)。

Cは常にsqrtfが呼ばれない限り、二重のバージョンを返します。

との通話をキャストしてみ(ダブル)

MSDNから: [

double sqrt(
   double x 
);
float sqrt(
   float x 
);  // C++ only
long double sqrt(
   long double x
);  // C++ only
float sqrtf(
   float x 
);

] 1

cmathで:: SQRTをはstdするには、いくつかのオーバーロードがあります。一つは、フロートを取り、別の二重になります。コンパイラは、あなたが呼ばれるようにしたいのかを知ることはできない、とint型は、それらのいずれかにキャストすることができます。

追加のオーバーロードがない場合には、それは自動的にあなたが期待するよう、これはCの場合である]倍増する投じるます。

はい、それは自動的に倍増するint型からキャストする必要があります。 G ++はので、私はVSが間違っていると思います。この罰金コンパイル

EDIT:MOの答えはダウン投票された理由はわかりません。しかし、私は、C ++でのオーバーロード機能の際、自動変換は常に自動変換で最高のデータ型に起こるべきことは可能だと思います。 EXのために:長く、float型とdoubleへの中へと変換するオプションがある場合、それは常にダブルコンバージョンにint型をしなければならない。

私はグラムでこれを試してみました++、それがSQRT(ダブル)関数を呼び出すされます。

#include <iostream>
#include <cmath>
#include <typeinfo>
using namespace std;

int main(){
    int k;
    for(k = 1; k <= 10; k++)
        cout << "The square root of k is: " << sqrt(k) <<' '<<  typeid(sqrt(k)).name()<< endl;
    return 0;
}

だから、型IDの出力()は、それが二重にint型からの自動変換を行っていることを意味し、「D」である。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top