Nic*_*nar 2 c++ function pass-by-reference
使用C++,我想创建一个vector对象的实例input,如main()下面的测试程序的功能所示.所述input载体中填充有数据,然后传递通过参考compute()功能.compute函数是返回两个向量对象real和imag.
是否可以按照下面的代码片段中显示的方式返回这两个矢量对象?
使用编译此代码gcc会产生以下错误:
In function ‘void compute(const std::vector<double>&, std::vector<double>&, std::vector<double>&)’:
error: declaration of ‘std::vector<double> real’ shadows a parameter
error: declaration of ‘std::vector<double> imag’ shadows a parameter
Run Code Online (Sandbox Code Playgroud)
也许有更好的方法来做到这一点?这是完整的测试程序:
#include <iostream>
#include <vector>
void compute(const std::vector<double> &input,
std::vector<double> &real, std::vector<double> &imag)
{
unsigned int N = input.size();
unsigned int csize = (N / 2) + 1;
// the error occurs here
std::vector<double> real(csize);
std::vector<double> imag(csize);
for (int i = 0; i < csize; i++)
{
real[i] = input[i] * i;
imag[i] = input[i] * -i;
}
} // end
int main()
{
const int num = 10;
std::vector<double> input(num);
for(int i = 0; i < num; i++)
input[i] = i;
std::vector<double> real;
std::vector<double> imag;
compute(input, real, imag);
} // end
Run Code Online (Sandbox Code Playgroud)
向量已经存在,因此您不希望再次创建它们,而是将它们调整为适当的大小:
real.resize(csize);
imag.resize(csize);
Run Code Online (Sandbox Code Playgroud)
你的代码实际上是有效的,但是因为你正在编译-Werror它被拒绝了.通过"阴影"意味着您将创建和修改函数本地的向量,因此通过引用传递的向量将不会更新.