如何将矢量从类传递给函数?

时间:2014-12-13 20:04:28

标签: c++ pointers c++11 vector reference

我有一个班级Point,为了简单起见,它看起来像这样:

template<class DivisionSpace>
class Point {
 public:
  typedef typename DivisionSpace::FT FT;

  const std::vector<FT>* get_coords() const {
    return &coords;
  }
 private:
  std::vector<FT> coords;
};

现在,我想在main中将此类的向量传递给期望的函数 std::vector<FT>& q。我传递了一个引用,以避免复制。我可以使用指针,但这意味着我必须更改许多行代码(因为项目的结构)。

我该怎么办?是否有任何&#34;技巧&#34;用C ++ 11?


修改

这是函数的原型:

void search_nn_prune(std::vector<FT>& q,
                       std::vector<std::pair<float, int> >& res,
                       int max_leaf_check, bool sorted_results = false, int k =
                           1,
                       float epsilon = 0) {

主要是我做

  std::vector< Point<Division_space> > q;

  std::vector<std::vector<std::pair<float, int> > > results(Q);
  for(int i = 0; i < Q; ++i) {
    const std::vector<FT>* query = q[i].get_coords();
    kdf.search_nn_prune(query, results[i], max_leaf_check, false, k, epsilon);
  }

这是错误

error: no matching function for call to ‘Random_kd_forest<Division_Euclidean_space<int> >::search_nn_prune(const std::vector<int, std::allocator<int> >*&, std::vector<std::pair<float, int> >&, int&, bool, int&, float&)’
note: candidates are:
note: void Random_kd_forest<DivisionSpace>::search_nn_prune(std::vector<typename DivisionSpace::FT>&, std::vector<std::pair<float, int> >&, int, bool, int, float) [with DivisionSpace = Division_Euclidean_space<int>, typename DivisionSpace::FT = int]
note:   no known conversion for argument 1 from ‘const std::vector<int, std::allocator<int> >*’ to ‘std::vector<int, std::allocator<int> >&’
note: void Random_kd_forest<DivisionSpace>::search_nn_prune(size_t, std::vector<std::vector<std::pair<float, int> > >&, int, bool, int, float) [with DivisionSpace = Division_Euclidean_space<int>, size_t = unsigned int]
note:   no known conversion for argument 2 from ‘std::vector<std::pair<float, int> >’ to ‘std::vector<std::vector<std::pair<float, int> > >&’

2 个答案:

答案 0 :(得分:1)

问题在于,您的search_nn_prune函数需要vector<FT>&个参数,但您要将const vector<FT>&传递给const。您无法将对search_nn_prune对象的引用传递给需要可修改对象的函数。

如果vector<FT>不应修改给定的const,请将Point添加到函数声明中的参数中。如果 应该修改向量,您需要决定如何解决这种情况:const不允许更改坐标向量返回,但您想将其传递给将更改坐标的函数。

通过引用获取参数的函数通常应该使用{{1}}引用,除非该函数是意图来修改它给出的对象。

答案 1 :(得分:1)

您应该声明该函数接受对{vector

const引用
void search_nn_prune(const std::vector<FT>& q, ...

你可以通过

kdf.search_nn_prune(*query, ...

(请注意*解除引用的明星)