我有一个类模板,其中包含成员变量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 > *“
有人可以解释如何解决此问题吗?
答案 0 :(得分:1)
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;
}
无论哪种方式,请注意我都删除了引用。当您不修改指针所指向的内容时,没有充分的理由按引用传递指针。而是按值传递指针。