![](/img/trans.png)
[英]C++ casting a pointer to a reference to pointer of base class in function parameter
[英]pointer parameter passed by reference in a function c++
我有一個類模板,該模板具有成員變量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不能使用類型為“ std :: vector <float,std ::”的值初始化類型為“ const std :: vector <float,std :: allocator <float >> *&”的引用(非const限定)。分配器<float >> *“
有人可以解釋如何解決此問題嗎?
setData()
的輸入參數是對指向const std::vector
的非const指針的引用。 但是,您指向的std::vector
對象不是const
。
在這種情況下根本沒有理由使用指針。 更改setData()
以通過const引用代替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;
}
無論哪種方式,請注意我都刪除了引用。 當您不修改指針所指向的內容時,沒有充分的理由按引用傳遞指針。 而是按值傳遞指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.