2012-03-09 33 views
9

私が読んで試したことから、デフォルトの引数を関数テンプレートに置くことはできません。私はコンパイラからも、他の人たちからも何とか答えています...私は新聞であり、より技術的な回答のいくつかは理解しにくいので、私は尋ねています。このための回避策はありますか?私はこのためにクラスを作ることができると仮定し関数テンプレートのデフォルト引数C++

template <typename Type, typename Compare = std::less<Type> > 
Type FindMax(std:vector<Type> &vec, Compare comp = Compare()) { 
    return *std::max_element(... 
} 

を、それは多くの作業のように思える:私はつまり...オーバーロードするオプションを指定して、デフォルトのリレーショナル演算子を使用しますが、findmax機能を作成しようとしています私が本当に欲しいのはひとつの機能です...ありがとう!

私は私が前に見てきた何かについてだけでなく、別の質問を追加する必要があります

具体的には、(cmpFn)何で、この関数tempateをするのかどう...)デフォルトの引数はやって?

template <typename ElemType> 
    ElemType FindMax(Vector<ElemType> &v, int (cmpFn)(ElemType, ElemType) = OperatorCmp) 
+0

* [C++テンプレート関数のデフォルト値](http://stackoverflow.com/questions/3301362/c-template-function-default-value)*の重複が考えられます。 –

答えて

8

は、物事の数は言うことがあります:あなたが定義されて何

  1. 関数テンプレート、ないクラステンプレートです。あなたはデフォルトのテンプレートパラメータ

    typename Compare = std::less<Type>

    を使用しているので、私はすべてのために、私は関数テンプレートは、標準の以前のバージョンでは、デフォルトのテンプレートパラメータを許可していませんでした知っているので、あなたはすでに、C++ 11を使用していると推定します。一方

  2. デフォルトの引数は、この

    Compare comp = Compare()

    のようなテンプレートパラメータのも、標準の以前のバージョンで可能でした。既定の引数がテンプレート化されたパラメータでは不可能であるという記述は間違っています(あるいは、実際にはという既定のテンプレートパラメータと呼んでいます)。

  3. コンパイラエラーメッセージは、その他の問題が原因である可能性があります。おそらくTypeが使用されて、std::lessとうまくいかないか、または使用するCompareタイプがデフォルトのコンストラクタを実装していない可能性があります。いずれにしても、以下のプログラムはGCC 4.6でコンパイルされます。2(つまり、より多くの右のように見えたので、私はconst std::vector<> &std::vector<> &を変更したことに注意してください):

 

#include <vector> 
#include <functional> 
#include <algorithm> 

template <typename Type, typename Compare = std::less<Type> > 
Type FindMax(const std::vector<Type> &vec, Compare comp = Compare()) { 
    return *std::max_element(vec.begin(),vec.end(),comp); 
} 

int main() { 
    FindMax(std::vector<int>()); 
    return 0; 
} 

をそして実際、これは-std=C++0xオプションを必要としますが、その理由は、デフォルトのテンプレートパラメータではなく、デフォルトの引数

関数パラメータ、機能そのものである、すなわち、引数を宣言します:cmpFnに関連する追加の質問について

。宣言

int (cmpFn)(ElemType, ElemType) 

は、その戻り値の型がintで、関数のローカル名がcmpFnであることを意味し、それは両方のタイプElemTypeの2つの引数を取ります。考えられるのは、呼び出し側が関数(またはファンクタ)を渡し、ベクトルの要素を比較するために使用されるということです。例えば。あなたはこのような関数宣言の前にその引数OperatorCmpのデフォルト値を定義する場合:

int OperatorCmp(int a, int b) { 
    return (a<b?-1:(a>b?1:0)); 
} 

宣言は有効となり、あなたはstd::vector<int>の最大値を見つけるためにそれを使用することができます。

+0

ありがとうございます。その2番目の部分は私が探していたものですが、私はそれを認識しませんでした...関数のパラメータ。 – MCP

+1

注: 'cmpFn'は、' std :: max_element'で使用することはできません。なぜなら、3値結果ではなく、ブール結果( '<')に似ているからです。 –

5

これはC++ 11で行うことができます。 C++ 03では、異なる数の引数を持つ2つのオーバーロードを作成し、一方から他方へと転送することで、簡単に回避できます。

template <typename Type> 
Type findMax(std::vector<Type> const & v) { 
    return findMax(v, std::less<Type>()); 
} 

また、標準のアルゴリズムを使用して、独自のコードを書く必要がなくなります。

関連する問題