2012-12-11 12 views
5

テンプレートに距離関数を渡す必要があります。したがって、boost :: functionとboost :: bindを使用します。しかし、私はクラスの距離のために合格しなければならないものを理解していない:boost ::関数をテンプレートに渡します。どのクラスがboost :: functionですか?

template<class DataType, class Point, class Distance> 
class CoverTree 
{ 
    Distance distance; 
    ... 
    public: 
    CoverTree(const Distance& distance) : max_level(default_max_level), min_level(default_max_level), distance(distance) {} 
    ... 
} 

テンプレートの作者例は次のようになります。

float euclidian(const std::vector<float>& p1, const std::vector<float>& p2) 
{ 
    ... 
} 
int main(int argc, char** argv) 
{ 
    CoverTree<float, std::vector<float>, float (*const)(const std::vector<float>&, const std::vector<float>&)> tree(&euclidian); 
    ... 
} 

今これは私のメインです:

int main(int argc, char** argv) 
{ 
    AllData myData; 
    boost::function<float (const vector<Frame>::const_iterator&, const vector<Frame>::const_iterator&)> j_dist; 
    j_dist = boost::bind(&AllData::jaccard_distance, myData, _1, _2); 
    myData.AddData("C:\\..."); 
    cout<<j_dist(myData.DATAx.begin()+20, myData.DATAx.begin()+40)<<endl; //works fine 
    CoverTree<float, vector<Frame>::const_iterator, ???> tree(&j_dist); 
    ... 
} 

最初に、私はこれについて何か(* const)の意味またはどこで読むことができますか?
2番目: 私はあなたが書くものを教えるために必要なものすべてを書いたと思います???しかし、私はそれを取得しません。
私はすでに試みた:

boost::function<float (const vector<Frame>::const_iterator&, const vector<Frame>::const_iterator&) 

float (*const) (const vector<Frame>::const_iterator&, const vector<Frame>::const_iterator&) 

が、これはいいトライアンドエラー:)まず

答えて

3

た、Somoneのは、私を説明することができるもの(* constのこと)を意味かどこでこれについて読むことができますか?

著者の例では、距離の関数である:

float euclidean(const std::vector<float>&, const std::vector<float>&); 

CoverTreeコンストラクタに渡された引数がすなわち&euclidean、タイプ

float (*)(const std::vector<float>&, const std::vector<float>&) 
の関数ポインタですもの関数のアドレスです

CoverTreeのテンプレートパラメータは、単にそのタイプのconst - 修飾バージョンです。これは、として宣言さintconstポインタに類似している

float (* const)(const std::vector<float>&, const std::vector<float>&) 

:起因CおよびC++における関数の「裏返し」特有宣言子構文に、その機能タイプへのconstポインタは次のように宣言されています。あなたのケースでは

int* const 

、あなたがタイプの権利を持って、それはです:

boost::function<float (const vector<Frame>::const_iterator&, const vector<Frame>::const_iterator&) 

はのは、それを参照するためのtypedefを使用してみましょう:

typedef boost::function<float (const vector<Frame>::const_iterator&, const vector<Frame>::const_iterator&) distance_func; 

が、問題は、あなたが、あなたがその型へのポインタを渡しているその型の引数を渡すされていないということです。

CoverTree<float, vector<Frame>::const_iterator, distance_func> tree(&j_dist); 
                    ^^^^^^^ 

あなたが行うことによって動作しません、これを見ることができます:

distance_func f = &j_dist; // ERROR! cannot convert distance_func* to distance_func 

答えが正しい型の引数を渡すために、単純に次のようになります。

CoverTree<float, vector<Frame>::const_iterator, distance_func> tree(j_dist); 
                    ^^^^^^ 
+0

ありがとうございました!これはコンパイルされます!どのように私はこれを解決としてタグ付けできますか? –

+0

@ user__42:答えの左上隅にあるチェックマークのアイコンを探します。 – aschepler

関連する問題