0

私は次の機能を持っています:

T* tContainer_t<T, R>::Remove( T item )
{    
    typename R::const_iterator it = std::find_if(Container.begin(), Container.end(),  [item](const T* v) { return std::fabs(*v - item) < DBL_EPSILON; });
    if (it != Container.end())
    {
        ...
    }
    else
        return NULL;
}

Tint、、、doubleなどfloat.... _

コンパイラは私に与えます'fabs' : ambiguous call to overloaded function when using templates

何が問題で、どうすれば解決できますか?

ありがとう。

4

1 に答える 1

6

Tint、ダブル、floatなどにすることができます。

std::fabsC++ にはfloat、、、doubleおよびの 3 つのオーバーロードがありlong doubleます。

std::fabstype の引数で呼び出そうとするとint、オーバーロードのあいまいさが原因でコンパイル エラーが発生します。引数は、利用可能な 3 つのintオーバーロードすべてに等しく一致します。

doubleあいまいさを解決する既知の型 (または など) に引数をキャストできます。または、整数型の引数のあいまいさを解消するテンプレートでlong double呼び出しをラップすることもできます。fabs

あるいは、C++ には がありstd::abs、整数型と浮動小数点型の両方に対してオーバーロードされています ( と で宣言され<cmath>てい<cstdlib>ます)。さらに、C++11 を実装する最近の標準ライブラリ実装がある場合std::fabs、整数型の引数を指定して を呼び出すと、引数が自動的に type に変換されるdoubleため、あいまいさはありません。

于 2012-05-24T20:10:36.780 に答える