2017-02-06 17 views
0

libkdtree ++를 사용하면서 RRT를 구현하려고 노력하고 있습니다.이 라이브러리를 사용하는 방법을 이해하는 데 어려움을 겪고 있습니다. examples 다음, 나는 그런 나의 RRT 클래스의 윤곽을 정의하려고 :std :: ptr_fun 템플릿 클래스 및 struct의 인수 문제

Severity Code Description Project File Line Suppression State 
Error C2664 'std::pointer_to_unary_function<trajectory::Point<5>,std::size_t,size_t (__cdecl *)(trajectory::Point<5>)> std::ptr_fun<trajectory::Point<5>,std::size_t>(_Result (__cdecl *)(_Arg))': cannot convert argument 1 from 'double (__cdecl *)(trajectory::Point<c_dim>,std::size_t)' to 'size_t (__cdecl *)(trajectory::Point<5>)' test_RRT C:\ResearchCode\robot-new\robot\projects\RRT\include\RRT.h 83 
Error C2512 'std::pointer_to_binary_function<trajectory::Point<5>,std::size_t,double,_Result (__cdecl *)(_Arg1,std::_Arg2)>': no appropriate default constructor available test_RRT C:\ResearchCode\robot-new\robot\externals\libkdtree\kdtree++\kdtree.hpp 126 

내가 매우 여기에 입력있어서 제대로하고있어 무엇 : 이것은 다음과 같은 오류를 얻을 수

#pragma once 

#include "coupling_tree.h" 
#include "kdtree++/kdtree.hpp" 
#include <deque> 
#include <iostream> 
#include <vector> 
#include <limits> 
#include <functional> 
#include <set> 


namespace trajectory { 


    template<int c_dim> struct Point { 

     std::set<const void*> registered; 
     Eigen::VectorXd p; 


     Point(Eigen::VectorXd point) : 
      p(point) 
     { 
      assert(point.size() == c_dim); 
     } 



     ~Point() 
     { 
      bool unreg_ok = (registered.find(this) != registered.end()); 
      assert(unreg_ok); 
      registered.erase(this); 
     } 


     double distance_to(Point const & x) const 
     { 
      double dist = 0; 
      for (int i = 0; i < c_dim; ++i) 
       dist += (p[i] - x[i])*(p[i] - x[i]); 
      return std::sqrt(dist); 
     } 

     inline double operator[](size_t const N) const { return p(N); } 



    }; 

    template<int c_dim> double tac(Point<c_dim> p, size_t k) { return p[k]; } 


    template<int plant_dim, int c_dim> 
    class RRT { //TODO: Should this be abstract so we can quickly implement lots of RRT variants? 

     ///////TYPEDEFS 
     typedef Point<c_dim> point; 
     typedef KDTree::KDTree<c_dim, point, std::pointer_to_binary_function<point, size_t, double> > kd_tree; 



     ////////////VARIABLES 

    private: 
     kd_tree tree; 


     //////////////////// 




    public: 





    protected: 


    private: 

     const int getNumDim() const { 
      return plant_dim; 
     } 


    }; 



} 

특히 ptr_fun을 처음 사용하는 사람들이 이런 방식으로 사용되기 때문에 불만이 특히 많이 발생합니다. 누군가가 오류와 수정 사항을 설명 할 수 있습니까?

+1

Point의 operator []에 템플릿이 있고 클래스 포인트에 이미 템플릿 ....이 있습니다. – JHBonarius

+0

잘 잡았지만 문제가 변경되지 않습니다. 나는 코드를 편집 할 것이다. 감사! – user650261

답변

1

그래서 코드가 불완전합니다. 트리거를 유발하는 중요한 구현이 누락되었습니다. 경고를보십시오

cannot convert argument 1 from 'double (__cdecl *)(trajectory::Point<c_dim>,std::size_t)' to 'size_t (__cdecl *)(trajectory::Point<5>)' 

그래서 double로 인수로 size_t를 예상하는 것을 호출하려고합니다.

제가 생각할 수있는 것 중 하나는 std::pointer_to_binary_function<point, size_t, double>입니다. 이것을 double distance_to(Point const & x)에 사용하면 distance는 2 개의 Point-type 입력을 기대하기 때문에 작동하지 않습니다.

편집 : 그래서 라인이 형식을 사용 어디서 볼 수없는

typedef KDTree::KDTree<c_dim, point, std::pointer_to_binary_function<point, size_t, double> > kd_tree; 

보고 있지만, 종류 자체는 세 개의 매개 변수가있는 템플릿 유형을 기반으로합니다. 예상되는 것이 확실하지 않지만 템플릿 인수 1을 c_dim, 인수 2로 설정하고 Point 및 인수 3에 ... 정의되지 않은 이진 함수 포인터를?!

std :: pointer_to_binary_function에 대한 자세한 정보를 찾아야합니다. 원하는 기능을 생성자에 제공해야합니다. 나는.

typedef KDTree::KDTree<c_dim, point, std::pointer_to_binary_function<point, size_t, double>(tac) > kd_tree; 

여기 코드를 테스트 할 수 없습니다. 두렵습니다.

+0

나는 당신이 말하는 것을보고, 나는 templated argument list에서 double을 잊었다. 나는 두 번 추가 할 경우, 그러나, 지금 얻을 : 심각도 \t 코드 \t 설명 \t 프로젝트 \t 파일 \t 라인 \t 억제 상태 오류 \t C2512 \t '표준 : pointer_to_binary_function <궤도 :: 포인트 <5>, 표준 : : size_t로, 더블, _Result (__cdecl *) (_이며 Arg1, 표준 : _ ARG2)> ': \t test_RRT 사용할 수없는 적절한 기본 생성자 \t C : \ ResearchCode \ 로봇 새 \ 외관 \ 로봇 \ libkdtree \ kdtree ++ \ kdtree.hpp 내가 할 두 번째 부분을 이해하지 못합니다.이 버그를 해결하는 데는 단서입니까? – user650261

+0

좋아요, 그때 내 대답을 편집했습니다 – JHBonarius

+0

맞아요, 전체 오류는 단지 3 대신 2 개의 템플릿 인수를 전달하는 것이 었습니다. (또한 기본 생성자로 kd_tree를 인스턴스화하려고 시도했지만 관련이 없습니다.) 감사합니다! – user650261