2017-02-06 77 views
0

我試圖通過使用libkdtree ++,試圖實現RRT,雖然我找到了一些麻煩了解如何使用這個庫的工作我的方式。繼examples,我嘗試定義我的RRT類的輪廓爲這樣:的std :: ptr_fun參數困難模板類和結構

#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; 
     } 


    }; 



} 

我們得到以下錯誤:

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 

我在打字變得非常失去了在這裏和什麼特別是抱怨,特別是因爲我是以這種方式使用ptr_fun的新手。有人可以解釋錯誤,並修復?

+1

運營商[]在點有模板,而類點已經有模板 .... – 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>)' 

所以你試圖調用的東西,期望size_t作爲參數與雙。

一個我能想到的事情是std::pointer_to_binary_function<point, size_t, double>。如果你使用double distance_to(Point const & x),它將不起作用,因爲距離需要兩個點型輸入。

編輯: 所以看行

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

我不能看到你使用這種類型,但該類型本身是基於模板類型,有三個參數。我不知道什麼是預期,但你設置模板參數1至c_dim,參數2)點和參數3 ...未定義的二元函數指針?

你應該查找更多信息的std :: pointer_to_binary_function,你會看到,你需要與你想指向函數提供的構造。即

​​

我不能在這裏測試代碼,恐怕。

+0

我看到你在說什麼,我忘了在模板參數列表中的雙重。如果我加雙倍,不過,我現在得到:嚴重性\t代碼\t說明\t項目\t文件\t線\t抑制狀態 錯誤\t C2512 \t「的std :: 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

你說得對,整個錯誤是,我只是傳遞兩個模板參數,而不是三個。 (另外,試圖用默認的構造函數實例化一個kd_tree,但這是無關的。)謝謝! – user650261