void Create_moneys(shared_ptr<CoinMoney>* &ms){
int max = getSize(true);
for(size_t i = 0; i < max; ++i){
cout << "ms is : " <<typeid(ms[i]).name() << endl;
ms[i] = make_shared<CoinMoney>();
ms[i]->c50 = i+1;
ms[i]->c100 = i+2;
ms[i]->c500 = i+3;
}
}
int main(int argc, char* argv[]){
shared_ptr<CoinMoney> pm1[getSize(true)];
Create_moneys(pm1); // error
for(auto p : pm1)
CoinMoney_Print(*p);
return 0;
}
我收到此错误“无法将类型〜的非常量左值引用绑定到类型的右值
我该如何解决?
答案 0 :(得分:2)
Create_moneys()
是一个对指针进行可变引用的函数。
这意味着函数在技术上有可能以传播到调用者的方式修改指针本身。
例如:
int global_x;
void foo(int*& ptr) {
ptr = &global_x;
}
void bar() {
int local_x;
int * local_ptr = &local_x;
foo(local_ptr);
//local_ptr now points to global_x!
}
现在,pm1
是一个数组,当您调用Create_moneys(pm1);
时,语言会创建一个临时指针,该指针指向数组的开头。该临时值称为RValue,RValues是不可修改的常量,因此不允许您将它们用作可变的引用参数。
修复很简单,因为Create_moneys()
不会修改指针,因此没有理由通过引用接受其参数,只需将其声明为Create_moneys(shared_ptr<CoinMoney>* ms)
。