2015-04-10 3 views
2

Здесь ошибка я получаю:Функция Pointer Ошибка в C++

error: no matching function for call to ‘pcl::ConditionalEuclideanClustering 
<pcl::Normal>::setConditionFunction(bool (EuclideanPlaneSegmentation::*)(const pcl::Normal&, const pcl::Normal&, float))’ cec.setConditionFunction(&EuclideanPlaneSegmentation::customRegionGrowing;^note: candidate is:/segmentation/conditional_euclidean_clustering.h:125:7: 
    note: void pcl::ConditionalEuclideanClustering 
    <PointT>::setConditionFunction(bool (*)(const PointT&, const PointT&, float)) [with PointT = pcl::Normal] setConditionFunction (bool (*condition_function) (const PointT&, const PointT&, float))^note: no known conversion for argument 1 from ‘bool (EuclideanPlaneSegmentation::*)(const 
    pcl::Normal&, const pcl::Normal&, float)’ to ‘bool (*)(const pcl::Normal&, const pcl::Normal&, float)’ 

В принципе, у меня есть «EuclideanPlaneSegmentation» класс, и я пытаюсь применить этот PCl учебник: http://pointclouds.org/documentation/tutorials/conditional_euclidean_clustering.php

В учебнике, в Основная функция

cec.setConditionFunction (&customRegionGrowing); 

пытается добраться до функции:

bool 
    customRegionGrowing (const PointTypeFull& point_a, const PointTypeFull&  point_b, float squared_distance) 
    { 
    Eigen::Map<const Eigen::Vector3f> point_a_normal = point_a.normal,  point_b_normal = point_b.normal; 
    if (squared_distance < 10000) 
    { 
    if (fabs (point_a.intensity - point_b.intensity) < 8.0f) 
     return (true); 
    if (fabs (point_a_normal.dot (point_b_normal)) < 0.06) 
     return (true); 
    } 
    else 
    { 
    if (fabs (point_a.intensity - point_b.intensity) < 3.0f) 
    return (true); 
    } 
    return (false); 
    } 
} 

Я имею ту же функцию в моем классе, и я попробовал:

cec.setConditionFunction(&EuclideanPlaneSegmentation::customRegionGrowing); 

, но он не работает. Я получаю ошибку, которую я написал.

В моем классе, если я пытаюсь

cec.setConditionFunction (&customRegionGrowing); 

Я получаю эту ошибку:

/EuclideanPlaneSegmentation.cpp:402:28: error: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function. Say ‘&EuclideanPlaneSegmentation::customRegionGrowing’ [-fpermissive] 
     cec.setConditionFunction(&customRegionGrowing); 
           ^
    /EuclideanPlaneSegmentation.cpp:402:65: error: no matching function for call to ‘pcl::ConditionalEuclideanClustering<pcl::Normal>::setConditionFunction(bool (EuclideanPlaneSegmentation::*)(const pcl::Normal&, const pcl::Normal&, float))’ 
     cec.setConditionFunction(&customRegionGrowing); 

Кто-нибудь есть идея, что это неправильно с тем, как я могу решить эту проблему?

ответ

2

Метод setConditionFunction ожидает функцию, но вы передаете элемент (нестатический) метод. Объявление принятого метода static должно решить проблему.

1

Выполнение статического метода работы. Но если вы хотите динамически перенастроить параметры в своем состоянии, вы можете использовать

setConditionFunction(boost::bind(&regularization, this, _1, _2, _3))