3

さて、私はこのような機能を持っているとしましょう

template <typename T>
void Func(std::vector<T> x, T alpha = 1)
{
    // ... do stuff
}

このような複合型で使いたいです

std::vector<std::complex<double>> x;
Func(x, 5.5);

次に、コンパイラーは(VS2010)それがtemplate parameter 'T' is ambiguous理由でそれを文句を言いcould be 'double' or 'std::complex<double>'ます。明らかな修正、このように呼んでください

Func(x, std::complex<double>(5.5));

しかし、それは、私は望んでいません。なぜ自動的に複合型に変換できないのですか?

4

4 に答える 4

4

それが機能しない理由は、最初の引数がTとして推定されるのstd::complex<double>に対し、2番目の引数はそれをとして推定されるためdoubleです。引数を推測するときに、変換を考慮しないだけです。明らかに、これは控除を曖昧にします。

identityヘルパーの助けを借りて、2番目の引数タイプを強制的に推論できないようにすることができます。

template <typename T>
struct identity { typedef T type; };

template <typename T>
void Func(std::vector<T> x, typename identity<T>::type alpha = 1)
{
    // ... do stuff
}
于 2013-03-27T12:48:30.583 に答える
3

これはどう?

template<typename T>
struct identity {
    typedef T type;
};

template <typename T>
void Func(std::vector<T> x, typename identity<T>::type alpha = 1)
{
    // ... do stuff
}

2番目の引数は、テンプレートパラメータの推定には関与せず、ベクトルテンプレート引数が使用されます。

于 2013-03-27T12:48:44.737 に答える
1

タイプが含まれているタイプとは異なるデフォルトの引数が必要な場合は、2つの異なるタイプを使用してください。

template <class T, class U>
void Func(vector<T> x, U y);
于 2013-03-27T12:51:03.090 に答える
0

IDヘルパーが気に入らず、コンバーチブルにしたい場合は、次のことを試してください。

template <typename T, typename U>
void Func(const std::vector<T>& x, U alphaU = 1)
{
    const T alpha(alphaU); // Convert to T
    // ... do stuff
}

アップデート:

あなたのコメントを再確認してください:私はhttp://liveworkspace.orgでいくつかのコンパイラでそれを試しました、そしてこのコードは私にとってうまく構築されます:

#include <vector>
#include <complex>

template <typename T, typename U>
void Func(const std::vector<T>& x, U alphaU)
{
   const T alpha(alphaU); // Convert to T
   (void) x;
   (void) alpha;
}

template <typename T>
void Func(const std::vector<T>& x)
{
    Func( x, 1 );
}    

int main()
{
   std::vector<std::complex<double>> v(10);
   Func( v, 5.5 );
   Func( v );
}
于 2013-03-27T12:50:08.520 に答える