2017-06-25 6 views
1

以下のテストプログラムでは、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 
+0

あなたは 'checkIt'という名前の関数のオーバーロードが1つしかないので、これが呼び出される可能性があります。 'checkit'という名前の関数に関連のない2つのオーバーロードがあります。 –

+0

タイプミスのようです。すべての 'checkit'を' checkIt'に変更すると、期待される結果が得られます。 – InternetAussie

+1

はい、 'bool'から' int'への標準的な変換があります。 – AnT

答えて

4

checkIt ISNは」ありません過負荷です。 boolバージョンのみです。

checkitがオーバーロードされています。 longintのバージョンがあります。

コードでcheckItを2回、checkitを1回呼び出します。

+0

他の方法では:1つの 'checkIt'、2つの' checkit's –

+0

@IgorTandetnikが編集されました。 – melpomene

+0

メルフォーメンありがとう、私の睡眠を救った、私はそれが狂っていたと思った:-) – Serge

0

C++の関数名(および他のほとんどすべて)は、CaSe SeNsItIvEです。
更新されたコードには、intタイプとlongタイプの2種類があり、2つのcheckItメソッドがあります。 checkItを3回呼び出し、メソッドに最後に最後に2回渡したのはboolの値です。 「ブール」型を受け付けない方法が存在しないようにC++ bool値に自動的true == 1false == 0

​​

intにキャストし、値が自動的にintにキャストし、intメソッドを呼び出します。

0

はいC++は暗黙のconversion.boolを使用します。charは自動的にint/short/longに、またはその逆に変換されます。

関連する問題