1

重複の可能性:
括弧のセットが空のデフォルト コンストラクターを呼び出す際のエラー

これを実行すると、コンパイラの警告が表示されます:34 [警告] `Rational test4() のアドレスは、常に true として評価されます。しかし、デフォルトのコンストラクターが有理数0/1になるようにしようとしています。34 行目は int main() 行: cout << test4; です。

#include <iostream>

using namespace std;

class Rational
{
public:
       Rational();

       friend ostream& operator <<(ostream& out,Rational rational1);


private:
        int numerator;
        int denominator;

};

int main()
{
    //Rational test1(24,6), test2(24);
    Rational test4();
    //cout << test1<< endl;
    //cout << test2<< endl;
    cout << test4;
    system("pause");
}

Rational::Rational() : numerator(0), denominator(1)
{ 
    //empty body
}

ostream& operator <<(ostream& out,Rational rational1)
{
       out << rational1.numerator <<"/"<<rational1.denominator;
       return out;
}
4

1 に答える 1

1

プログラムが「1」を出力する理由はRational test4();、関数ポインターを宣言しているためです。std::coutでは、関数ポインタをどのように出力するのでしょうか? これには自動変換が含まれます。まず、単純な古いデータ ポインターを調べます。double*I/O 機構には、ポインター、MyClass*ポインター、または発生する可能性のある無数のポインターのいずれかを出力するメカニズムがありません。I/O 機構ができることは、void*ポインターを出力するメカニズムです。暗黙的な変換のおかげで、すべてのポインターがポインターに変換されるため、同じメカニズムがポインターに対してdouble*機能します。MyClass*void*

関数ポインタは に変換されませんvoid*。関数ポインタはポインタではありません! 利用可能な唯一の変換は、ブール値への変換です。ブール値へのその変換は、あなたの関数ポインタがnullではないなどのことを行うためのif (function_pointer) do_something();ものです.booltrue1

解決策は簡単です: それRational test4();Rationaltest4;` に変更します。

于 2012-10-09T00:39:33.480 に答える