错误:重载调用是模糊的

时间:2016-03-23 04:21:24

标签: c++ overloading

bool find_solutions(const string if_need_all, vector< vector<char> > table, vector<int> ships, int row[], int col[]){
  sort(ships.begin(), ships.end(), greater<int>());//sort the ship length in descending order
  static int counter = 0; //counter that tracks if the ship is to be placed vertically or horizontally
  static int s = 0; //index of ship using
  int fill;//ship to fill
  int filling;//keep track how much the ship has been filled 
  if(s == ships.size()) return true;
  for(unsigned int i = 0; i<table.size(); ++i){
    filling = 0;
    fill = ships[s];
    for(unsigned int j = 0; j<table[i].size(); ++j){
      if(counter == 0 && insertable(table,row,col,i,j,counter,fill)){
        while(filling<fill){
          table[i][j+filling] = fill;
          col[j+filling]--;
          filling++;
        }
        row[i] -= fill; s++;
        find_solutions(if_need_all, table, ships, row,col);
      } 
      else{
        counter++;
      }
      if(counter == 1 && insertable(table,row,col,i,j,counter,fill)){
        while(filling<fill){
          table[i+filling][j] = fill;  
          row[i+filling]--;
          filling++;
        }
        col[j] -= fill; s++;
        find_solutions(if_need_all, table, ships, row, col);
      }
      else{
        counter--;
      }
    }
  }
  if(s != ships.size()) return false;
  else return true;
}
main.cpp: In function ‘bool find_solutions(std::__cxx11::string,     std::vector<std::vector<char> >, std::vector<int>, int*, int*)’:
main.cpp:277:67: error: call of overloaded     ‘insertable(std::vector<std::vector<char> >&, int*&, int*&, unsigned int&,    unsigned int&, int&, int&)’ is ambiguous
       if(counter == 0 && insertable(table,row,col,i,j,counter,fill)){
                                                               ^
main.cpp:13:6: note: candidate: bool insertable(const     std::vector<std::vector<char> >&, const int*, const int*, int, int, int, int)
 bool insertable(const vector< vector<char> >& inboard, const int r[], const int c[],
      ^
main.cpp:125:6: note: candidate: bool insertable(std::vector<std::vector<char> >, const int*, const int*, int, int, int, int)
 bool insertable(const vector< vector<char> > inboard,const int r[], const int c[],co
      ^

谁能告诉我我犯了什么错误? 我在网上搜索网站上说它已经多次创建了变量,或者STL库中已经存在函数名。我检查了两个条件,但它们不适用于我的问题。它是填充导致问题或其他变量,还是它的功能?

1 个答案:

答案 0 :(得分:2)

您使用以下参数类型重载insertable()

bool insertable(const std::vector<std::vector<char> >&,
                const int*, const int*, int, int, int, int)

bool insertable(std::vector<std::vector<char> >,
                const int*, const int*, int, int, int, int)

我们假设T

typedef std::vector<std::vector<char> > T;

两个方法定义中的第一个参数都是不明确的,因为两个方法都可以接受类型TT&作为第一个参数,因此编译器无法决定调用哪个重载方法。顺便说一句,你不应该创建reference不同的重载方法,而应该使用完全不同的类型。因为类型及其引用始终是兼容的,因此被认为是相同的。

对于前。 intint&兼容,因此insertable(int a)insertable(int& b)相同。如果你像下面这样调用这个方法,编译器就无法决定调用哪个方法。

int x = 20;
insertable(x);

同样,如果在函数调用中使用非常量T,则下面的定义也相同。

bool insertable(const T&, const int*, const int*, int, int, int, int)

bool insertable(T, const int*, const int*, int, int, int, int)
评论中的

@M.M

Tconst T&总是含糊不清。但是,当参数为 rvalue 时,TT&不会模糊不清。 rvalue 无法绑定到T&,并且 rvalues 分别重载的有效用例比 lvalues