3

クラスのメソッドで、値が 0 で return かどうかを確認していますがnullptr、それができないようです。

Complex Complex::sqrt(const Complex& cmplx) {
    if(cmplx._imag == 0)
        return nullptr;

    return Complex();
}

私が得ているエラーは次のとおりです。could not convert 'nullptr' from 'std::nullptr_t' to 'Complex'

私は今、それnullptrがポインタ用であることを理解していますが、私のオブジェクトはポインタではありません.nullまたは同様のものに設定する方法はありますか?

4

2 に答える 2

10

Complexポインタではない を返しています。を返すnullptrには、戻り値の型を にする必要がありますComplex*

あなたの編集に気づきました - あなたができることは次のとおりです:

bool Complex::sqrt(const Complex& cmplx, Complex& out) {
    if(cmplx._imag == 0)
    {
        // out won't be set here!
        return false;
    }

    out = Complex(...); // set your out parameter here
    return true;
}

次のように呼び出します。

Complex resultOfSqrt;
if(sqrt(..., resultOfSqrt))
{ 
    // resultOfSqrt is guaranteed to be set here
} 
else
{
    // resultOfSqrt wasn't set
} 
于 2013-07-17T23:11:28.453 に答える
4

エラーが示すように、nullptris not convertible to your typeComplexです。あなたができることは、(a)Complex*(またはもっと良いのはスマートポインター)を返しnullptr、関数が自明でない結果を持っているかどうかをテストするか、おそらく(b)Boost.Optionalのようなライブラリを使用して関数を設計することです返す有効なオブジェクトがない可能性があります。

実際、Boost.Optional のドキュメントにはdouble sqrt(double n)関数の例も示されていますが、これは負の値として定義してはならず、nあなたの例に似ています。Boostが使えるなら、例は次のようになります

boost::optional<Complex> Complex::sqrt(const Complex& cmplx) 
{
    if (cmplx._imag == 0)
        // Uninitialized value.
        return boost::optional<Complex>();

    // Or, do some computations.
    return boost::optional<Complex>(some parameters here);
}

役に立つかもしれないいくつかの関連する議論。

于 2013-07-17T23:12:08.723 に答える