2012-12-11 20 views
5

. Bu yüzden boost :: function ve boost :: bind kullanıyorum. Ama sınıf Mesafe için geçmek zorunda anlamıyorum:bir şablona bir boost :: işlevi geçirerek; hangi sınıf artırmak olduğunu :: Bir şablona bir mesafeye işlevi geçmesi gerekiyor fonksiyonu

: Şimdi bu benim ana olduğunu

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

:

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

şablonun yazar tarafından örnek şuna benzer

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

ilk başta somone (* const) ne anlama geldiğini bana açıklayabilir ya da nerede bu konuda okuyabilir?
İkincisi: Sana gereken her şeyi, için yazmak ne söylemek yazdı düşünüyorum ??? ama bunu alamadım. somone (* const) demek ya da ne bana açıklayabilir,

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

ve

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

ama bu ilk başta iyi deneme yanılma :)

cevap

3

oldu:
zaten denedim bu konuda okuyabileceğim yer neresi? yazarın örnekte

mesafe fonksiyonudur:

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

CoverTree yapıcıya argümanı tipinin bir fonksiyonu işaretçidir bu işlev, yani &euclidean, adresidir

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

CoverTree için şablon parametresi sadece o türdeki bir const ulaşım kolaylığı versiyonudur.

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

Bu ilan edilir int bir const pointer ile paralellik gösterir: nedeniyle C ve C işlevleri için tuhaf "tersyüz" Bildiricisi sözdizimi ++ için, bu fonksiyon tipine bir const işaretçi olarak ilan edilir:

senin durumunda
int* const 

, tür hakkı var, bu kadar:

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

en o başvurmak için bir typedef kullanalım:

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

ancak sorun, bu tip bir gösterici geçirildiğinden emin türünde bir argüman geçen olmamasıdır:

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

Sen yaparak işe yaramaz bunu görebilirsiniz:

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

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

cevabı sadece doğru tipte bir argüman iletilmesi olmalıdır

+0

Çok teşekkür ederim! Bu derler! Bunu nasıl çözülmüş olarak etiketleyebilirim? –

+0

@ user__42: Yanıtın sol üst kısmındaki onay işareti simgesini arayın. – aschepler

İlgili konular