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库中已经存在函数名。我检查了两个条件,但它们不适用于我的问题。它是填充导致问题或其他变量,还是它的功能?
答案 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;
两个方法定义中的第一个参数都是不明确的,因为两个方法都可以接受类型T
和T&
作为第一个参数,因此编译器无法决定调用哪个重载方法。顺便说一句,你不应该创建reference
不同的重载方法,而应该使用完全不同的类型。因为类型及其引用始终是兼容的,因此被认为是相同的。
对于前。 int
和int&
兼容,因此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:
T
和const T&
总是含糊不清。但是,当参数为 rvalue 时,T
和T&
不会模糊不清。 rvalue 无法绑定到T&
,并且 rvalues 分别重载的有效用例比 lvalues