我有一个班级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> > >&’
答案 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, ...
(请注意*
解除引用的明星)