2012-12-11 20 views
5

मुझे टेम्पलेट में दूरी-फ़ंक्शन पास करने की आवश्यकता है। इसलिए मैं boost :: function और boost :: bind का उपयोग करता हूं। लेकिन मुझे समझ नहीं आता कि मैं क्या के लिए वर्ग दूरी पारित करने के लिए है:एक बढ़ावा देने के लिए :: एक टेम्पलेट के लिए समारोह; कौन सा वर्ग बढ़ावा देता है :: फ़ंक्शन

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); 
    ... 
} 

पहले, क्या कोई मुझे समझा सकता है कि (* कॉन्स्ट) का मतलब है या मैं इसके बारे में कहां पढ़ सकता हूं?
और दूसरा: मुझे लगता है कि मैंने आपको जो कुछ भी चाहिए, उसे लिखा है, के लिए क्या लिखना है ??? लेकिन मुझे यह नहीं मिला।
मैं पहले से ही करने की कोशिश की:

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 मुझे समझा सकता है क्या (* स्थिरांक) का अर्थ है या जहां मैं इस बारे में पढ़ सकता हूँ?

लेखक का उदाहरण में सुदूर क्रिया है:

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

तर्क CoverTree निर्माता को पारित कर दिया है कि समारोह यानी &euclidean, जो प्रकार की एक समारोह सूचक है का पता है

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

CoverTree के लिए टेम्पलेट पैरामीटर बस उस प्रकार का const-योग्य संस्करण है।सी और सी में कार्यों के लिए अजीब "अंदर बाहर" declarator वाक्य रचना ++ के कारण, कि समारोह प्रकार के लिए एक स्थिरांक सूचक घोषित रूप में किया जाता है:

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

यह int करने के लिए एक 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); 
                    ^^^^^^^ 

आप यह देख सकते करके काम नहीं करेगा:

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

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

जवाब बस सही प्रकार की एक बहस पारित करने के लिए किया जाना चाहिए

+0

बहुत बहुत धन्यवाद! यह संकलित करता है! मैं इसे हल करने के रूप में कैसे टैग कर सकता हूं? –

+0

@ user__42: उत्तर के ऊपरी बाईं ओर स्थित चेकमार्क आइकन की तलाश करें। – aschepler

संबंधित मुद्दे