簡體   English   中英

在函數C ++中由引用傳遞的指針參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM