テンプレートの関数にテンプレートのパラメータとして関数std::max
を渡そうとしていますが、何らかの理由でコンパイラが関数の型を推測できないというエラーを出力します。簡単な例では同じ問題が再現されます。それは自分のmax2
機能で動作しますが、STL std::max
では動作しません:here見られるようにstd :: maxへの関数ポインタを格納する自動変数
#include <algorithm>
template <class T>
T max2(const T& a, const T& b) { return std::max(a, b); }
int main() {
#if 1
auto f = max2<float>;
#else
// error: unable to deduce ‘auto’ from ‘max<float>’
auto f = std::max<float>;
#endif
float max_val = f(1.0f, 2.0f);
return 0;
}
問題は、[複数の 'のstd :: max'がある]ということである(http://en.cppreference.com/w/cpp/algorithm/max)とコンパイラはどちら君を知りません欲しいです。 –
私は個人的に(非テンプレート)クラスを作成し、それにテンプレート関数呼び出し演算子(異なる署名を持つ複数の関数)を与え、そのクラスのオブジェクトを渡すテンプレート関数のスタイルを好みます。次に、テンプレートパラメータを指定する必要はありません。 'max'の代わりに 'max'を渡すことができます。悪いことに、複数のフリー関数のオーバーロードがある場合に必要な不安定な静的キャストです。 [range-v3](https://github.com/ericniebler/range-v3)ライブラリは、すべての機能に対してこれを行います。 –