параметр указателя, переданный по ссылке в функцию c ++ - PullRequest
0 голосов
/ 06 января 2019

У меня есть шаблон класса, который имеет переменную-член std::vector<T> buffer и функцию-член setData, среди прочих.

template <class T>
void ArrayT<T>::setData(const std::vector<T> * & data_ptr) {    
    buffer.assign(data_ptr->begin(), data_ptr->end());
}

Я хочу, чтобы setData выполнил глубокую копию данных, переданных в качестве аргумента. Как видите, аргумент имеет тип * &, который, если я правильно понимаю, является параметром указателя, переданным по ссылке.

Когда я пишу:

vector<float> vec(3, 1.0);
vector<float>* vec2 = &vec;
A obj();
obj.setData(vec2);

Я получаю ошибку:

E0434 ссылка типа "const std :: vector > * &" (не соответствует const) не может быть инициализирована значением типа "std :: vector > * "

Может кто-нибудь объяснить, как это исправить?

1 Ответ

0 голосов
/ 06 января 2019

Входной параметр setData() является ссылкой на неконстантный указатель на const std::vector. Но объект std::vector, на который вы указываете, не является const.

Нет смысла использовать указатель вообще в этой ситуации. Измените setData(), чтобы вместо этого взять std::vector по ссылке:

template <class T>
void ArrayT<T>::setData(const std::vector<T> &data)
{
    buffer.assign(data.begin(), data.end());
    // or simply: buffer = data;
}

vector<float> vec(3, 1.0);
Array<float> obj;
obj.setData(vec);

При этом, если вы хотите сохранить указатель, вам нужно сбросить const:

template <class T>
void ArrayT<T>::setData(std::vector<T> * data_ptr)
{
    buffer.assign(data_ptr->begin(), data_ptr->end());
    // or simply: buffer = *data_ptr;
}

Или, по крайней мере, переместите const после *, чтобы сделать указатель const вместо объекта, на который он указывает:

template <class T>
void ArrayT<T>::setData(std::vector<T> * const data_ptr)
{
    buffer.assign(data_ptr->begin(), data_ptr->end());
    // or simply: buffer = *data_ptr;
}

В любом случае, обратите внимание, я удалил ссылку. Нет веской причины для передачи указателя по ссылке, когда вы не изменяете то, на что указывает указатель. Вместо этого передайте указатель по значению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...