以下のテストプログラムでは、bool述語でcheckit
メソッドを呼び出すと整数オーバーロードが呼び出されます。どうして?関数の引数としてのC++のbool式が間違ったオーバーロードを呼び出す
(i == 10)
はブール値を作成する必要があります。ブール値を作成すると、boolオーバーロードが呼び出されます。
プログラム出力
should be int
I'm a bool 1
should be bool
I'm a bool 1
should also be bool
I'm a int 1
ソース
class Overload
{
public:
void checkIt(bool n) { printf(" I'm a bool %d\n", n); }
void checkit(long n) { printf(" I'm a long %ld\n", n); }
void checkit(int n) { printf(" I'm a int %d\n", n); }
};
int main(int argc, char *argv[])
{
Overload obj;
int i = 10;
bool b = true;
printf("should be int\n");
obj.checkIt(i);
printf("should be bool\n");
obj.checkIt(b);
printf("should also be bool\n");
obj.checkit((i == 10));
}
EDIT
当たり前!タイプミスで申し訳ありません。
しかし、boolメソッドをコメントアウトしてをコメントアウトすると、intメソッドがbool述語で呼び出されます。より適切な署名が見つからない場合、boolからintへのデフォルトの変換はありますか?厳密に言えば、何bool
私はどちらか、コンパイルエラーまたは実行時エラーを期待していたので、署名...
更新されたコード
class Overload
{
public:
//void checkIt(bool n) { printf(" I'm a bool %d\n", n); }
void checkIt(long n) { printf(" I'm a long %ld\n", n); }
void checkIt(int n) { printf(" I'm a int %d\n", n); }
};
int main(int argc, char *argv[])
{
Overload obj;
int i = 10;
bool b = true;
printf("should be int\n");
obj.checkIt(i);
printf("should be bool\n");
obj.checkIt(b);
printf("should also be bool\n");
obj.checkIt((i == 10));
}
更新された出力
should be int
I'm a int 10
should be bool
I'm a int 1
should also be bool
I'm a int 1
あなたは 'checkIt'という名前の関数のオーバーロードが1つしかないので、これが呼び出される可能性があります。 'checkit'という名前の関数に関連のない2つのオーバーロードがあります。 –
タイプミスのようです。すべての 'checkit'を' checkIt'に変更すると、期待される結果が得られます。 – InternetAussie
はい、 'bool'から' int'への標準的な変換があります。 – AnT