2014-12-13 4 views
0

У меня есть класс, который Point -для ради simplicity- выглядит следующим образом:Как передать вектор из класса в функцию?

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

Теперь я хочу в основном, чтобы передать вектор этого класса в функцию, которая ожидает std::vector<FT>& q. Я передаю ссылку, чтобы избежать копирования. Я мог бы использовать указатель, но это означало бы, что мне нужно изменить многие строки кода (из-за структуры проекта).

Как это сделать? Может быть, какой-нибудь «трюк» с C++ 11?


EDIT

Вот прототип функции:

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> > >&’ 

ответ

1

Проблема заключается в том, что ваша функция search_nn_prune требует аргумента vector<FT>&, но вместо этого вы передаете его const vector<FT>&. Вы не можете передать ссылку на объект const в функцию, которая хочет модифицировать.

Если search_nn_prune не должен модифицировать данное vector<FT>, добавьте const к аргументу в объявлении функции. Если это -, который должен изменить вектор, вам нужно будет решить, как вы хотите разрешить ситуацию: Point не позволяет изменениям вектора координат, который он возвращает, но вы хотите передать его функции, которая будет измените координаты.

Функции, которые принимают аргументы по ссылке, обычно должны принимать const ссылки, если только функция не предназначена для, чтобы изменить предоставленный объект.

1

Вы должны объявить функцию приняв const ссылку на вектор

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

и вы можете передать

kdf.search_nn_prune(*query, ... 

(обратите внимание на * Разыменование звезда)

Смежные вопросы