通过引用传递列表时出错(C ++)

时间:2014-08-20 11:10:56

标签: c++ list compiler-errors pass-by-reference

我正在尝试用C ++编写一个子程序,将一个单元格的位置放在一个正方形网格上并返回其邻居的列表,因此对于大多数单元格,它将返回4个邻居,但边缘上的单元格只会有3个,在角落里只有2个。我不是一个非常熟练的C ++程序员,所以我在这里找了一些帮助,通过引用传递列表(C++ pass list as a parameter to a function)。

我收到此错误:

In function ‘void findNeighbours(int, int, int, int, std::list<int, std::allocator<int> >&)’:

error: invalid conversion from ‘int*’ to ‘int’

这是我的代码:

void findNeighbours(int x, int y, int xSIZE, int ySIZE, list<int>& neighbours){
  int n[2]={x-1,y};
  int e[2]={x,y+1};
  int s[2]={x+1,y};
  int w[2]={x,y-1};
  switch(x){
    case 0: {neighbours.push_back(s);}
    case xSIZE-1: {neighbours.push_back(n);}
    default: {neighbours.push_back(n);neighbours.push_back(s);}
  }
  switch(y){
    case 0: {neighbours.push_back(e);}
    case ySIZE-1: {neighbours.push_back(w);}
    default: {neighbours.push_back(e);neighbours.push_back(w);}
  }
}

导致错误的行似乎是这一行:     案例0:{neighbours.push_back(s);}

但我无法看到我所做的与我查找的示例(上面链接的)不同。

正如我所说,我不是最熟练的C ++编码器,所以请尽可能用简单的语言解释。我习惯使用Python,所以我对指针等不太好。

先谢谢你的帮助,

FJC

3 个答案:

答案 0 :(得分:2)

变量s被定义为两个元素的数组

int s[2]={x+1,y};

虽然列表的值类型具有int

类型
list<int>& neighbours

您正在尝试push_back数组而不是int

类型的对象
case 0: {neighbours.push_back(s);}

我认为,无论如何,至少由于这个奇怪的陈述,该函数没有任何意义

case xSIZE-1: {neighbours.push_back(n);}

案例标签应为常量表达式。

答案 1 :(得分:1)

s是数组(int[]),neighbours.push_back是单int!使用示例neighbours.push_back(s[0])neighbours.push_back(s[1])或其他任何内容,int

答案 2 :(得分:0)

一件天真的事情是每次在一行上添加每个邻居。 我们不能在switch语句中使用像xSIZE这样的非常量表达式。 这使得代码非常长,并且迫切需要将其重构为更整洁的东西,但这是一个开始。 我也会返回列表,而不是通过引用传递它:

list<int> findNeighbours(int x, int y, int xSIZE, int ySIZE){
  list<int> neighbours;
  int n[2]={x-1,y};
  int e[2]={x,y+1};
  int s[2]={x+1,y};
  int w[2]={x,y-1};
  if(x == 0)
  {
    neighbours.push_back(s[0]);
    neighbours.push_back(s[1]);
  }
  else if (x == xSIZE-1)
  {
    neighbours.push_back(n[0]);
    neighbours.push_back(n[1]);
  }
  else
  {
    neighbours.push_back(s[0]);
    neighbours.push_back(s[1]);
    neighbours.push_back(n[0]);
    neighbours.push_back(n[1]);
  }

  if(y == 0)
  {
    neighbours.push_back(e[0]);
    neighbours.push_back(e[1]);
  }
  else if (y == ySIZE-1)
  {
    neighbours.push_back(w[0]);
    neighbours.push_back(w[1]);
  }
  else
  {
    neighbours.push_back(e[0]);
    neighbours.push_back(e[1]);
    neighbours.push_back(w[0]);
    neighbours.push_back(w[1]);
  }
  return neighbours;
}