在函数C ++中由引用传递的指针参数

时间:2019-01-06 18:31:09

标签: c++ pointers reference

我有一个类模板,其中包含成员变量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 :(得分: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;
}

无论哪种方式,请注意我都删除了引用。当您不修改指针所指向的内容时,没有充分的理由按引用传递指针。而是按值传递指针。