4

大きな計算ジオメトリ ライブラリがあります。カーネルに問題があります。cg::epsilon<T>()の代わりに単純に書くために、自由関数の形式で定義されたスカラー テイトとヘルパー アクセサがありcg::scalar_traits<T>::epsilonます。しかし、vs2008 と vs2010 では、Tinのテンプレート パラメーターを推定できなかったと主張することがあるという問題がありますcg::epsilon<T>。LWS の他のコンパイラでは正常に動作します。

再現する縮小版:

namespace cg
{

template<class S>
S epsilon();

template<>
double epsilon<double>() {return 1;}
template<>
float epsilon<float>() {return 1;}

template<class S>
bool eq(S a, S b, S eps = cg::epsilon<S>())
{
   return true;
}

}


int main(int argc, char* argv[])
{
   cg::eq(0.0, 0.0);
   cg::eq(0.0f, 0.0f);
   return 0;
}

アクセサーを機能させるための回避策はありますか?

PS:cg::scalar_traits<S>::epsilon()エラーが発生した場合に役立つ を使用していますが、冗長すぎます

研究: としても宣言されています

template<class S>
bool eq(S a, S b, S eps = cg::epsilon<double>())

コンパイラは、cg::epsilon の S を推測できなかったと不平を言っています。

4

1 に答える 1

1

私の推測では、コンパイラはS eps = cg::epsilon<S>()の推論でデフォルトのパラメータを使用していますS。このためには、の宣言を調べる必要がありますcg::epsilon<S>()が、現時点ではまだわかりSません。

a回避策は、3 番目のパラメーターの既定値を回避bし、 eps2つの異なるオーバーロードを追加することaですb。後者は(この時点ではすでに推定されています) から取得し、以下のコードが示すように前者に呼び出しを委譲しますepscg::epsilon<S>()S

template<class S>
bool eq(S a, S b, S eps)
{
    return true;
}

template<class S>
bool eq(S a, S b)
{
    S eps = cg::epsilon<S>();
    return eq(a, b, eps);
}
于 2013-03-20T10:24:43.180 に答える