Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将std::vector传递到数组引用 我遇到了一个问题,试图将一些旧的C++代码与更现代的数据结构相连接。strong>不幸的是,我无法更改旧代码的接口,因此我只能使用编写的函数_C++ - Fatal编程技术网

将std::vector传递到数组引用 我遇到了一个问题,试图将一些旧的C++代码与更现代的数据结构相连接。strong>不幸的是,我无法更改旧代码的接口,因此我只能使用编写的函数

将std::vector传递到数组引用 我遇到了一个问题,试图将一些旧的C++代码与更现代的数据结构相连接。strong>不幸的是,我无法更改旧代码的接口,因此我只能使用编写的函数,c++,C++,特别是,有一个函数将以下内容作为参数: int doStuff(FooObj* (&foo_array), int n_elements) { // do stuff with array member 0 FooObj* foo = &(foo_array[0]) ... } 基本上,此函数在遗留代码中的使用方式是在堆上创建指向FooObj数组的指针,然后将其传递给函数: FooObj* foos; foos = new FooObj[100]; doStuff(

特别是,有一个函数将以下内容作为参数:

int doStuff(FooObj* (&foo_array), int n_elements) {
  // do stuff with array member 0
  FooObj* foo = &(foo_array[0])
 ... 
}
基本上,此函数在遗留代码中的使用方式是在堆上创建指向FooObj数组的指针,然后将其传递给函数:

FooObj* foos;
foos = new FooObj[100];
doStuff(foos, 100);
delete [] foos;
我想做的是传入一个FooObj向量(因为内容将动态调整大小),但我在理解指针/引用语义方面遇到了困难。如果我尝试以下方法:

std::vector<FooObj> foos;
foos.resize(100);
doStuff(&foos[0], 100);
std::vector foos;
调整大小(100);
多斯塔夫(和福斯[0],100);
我得到错误:
从类型为“FooObj*”的临时文件中初始化类型为“FooObj*&”的非常量引用无效。


可以这样传递向量吗?

这与堆与堆栈无关。一个近似的经验法则:当传递一个声明为引用的参数时,必须传递一个左值。因此:

std::vector<FooObj> foos;
foos.resize(100);

FooObj *p=&foos[0];

doStuff(p, 100);
std::vector foos;
调整大小(100);
FooObj*p=&foos[0];
多斯塔夫(p,100);

出现编译器错误的原因是表达式“
&foos[0]
”是一个右值,您必须在此处插入一个左值。因此:将其设为左值。

您的
doStuff()
声明不支持
vector
。您需要更改签名,还需要将实现更改为使用vector。请记住,您使用的Vector
&foos[0]
是右值,右值不能绑定到左值引用。你根本不应该这么做。只需使用一个类型为
std::vector&
的参数,好吧,有一件事我没有说清楚,就是我不能碰doStuff方法。然后你需要枪毙编写它的人,因为除非它真的修改
foo_array
(它是指针,而不是数组),否则它完全没有意义。尝试
FooObj*temp=&foos[0]和密码:)代码真的很可怕;这还不够。不管怎样,通过临时工就可以了。