2016-03-23 15 views
0
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 
    ^

Web sitelerinin çevrimiçi olarak, değişkenlerin birkaç kez oluşturulduğunu veya STL kitaplığında zaten işlev adı bulunduğunu söyledim. Her iki durumu da kontrol ettim ve onlar benim problemim için geçerli değiller. Dolguya neden olan problem mi yoksa başka değişken mi, yoksa fonksiyon mu?hatası: Aşırı yüklenmiş durumun, belirsiz olduğunu belirten bir kişi bana herhangi bir hata yaptığını söyleyebilir mi?

+0

senin "sokulabilir" işlevidir aşırı geçerli bir kullanım durumu? –

+0

Burada anlamlı bir cevap vermek için neredeyse yeterli bilgi yok, ancak ad alanı std'yi kullandığınız anlaşılıyor. Standart kütüphanede aynı şekilde isimlendirilmiş bir fonksiyona sahip bir hurdaya girmeyi tanımladığınız işlev gibi, bolluk için bolca yer vardır. – user4581301

cevap

1

Aşağıdaki parametre türleriyle insertable() aşırı yüklüdür.

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) 

iki yöntem de ilk parametre olarak türlerini T ve T& kabul edebilir çünkü her iki yöntem tanımında ilk parametre belirsiz T

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

olarak alalım, Yani derleyici aşırı hangi karar veremez çağırma yöntemi. BTW reference içinde farklı olan aşırı yüklenmiş yöntemler oluşturmamalı, bunun yerine tamamen farklı bir tür kullanmalısınız. Bir tür ve referansı her zaman uyumlu olduğundan, aynı şekilde kabul edilir.

Örn. int ve int& uyumludur, bu nedenle insertable(int a) ve insertable(int& b) aynıdır. Aşağıdaki gibi bu yöntemi çağırırsanız derleyici hangi yöntemin kullanılacağına karar veremez. tanımları aşağıda Aynı şekilde

int x = 20; 
insertable(x); 

, ayrıca işlev çağrısında olmayan const T kullanıldığında aynıdır. yorumlarda

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 ve const T& hep belirsizdir. Ancak, rivalue rölesi T ve T& belirsizdir. rvalueT& bağlanan edemez ve SağDeğerler için ayrı ayrıdaha SolDeğerler

+1

'T' ve' const T & 'her zaman belirsizdir. Ancak argüman bir ritim ise “T” ve “T” belirsiz değildir. Değer, "T &" ile bağlanılamaz. –

+0

Teşekkürler. Hatayı düzeltmek için ihtiyacım olan şey bu! –

+0

@JimmyLi Sorunu çözdüyseniz çözümü kabul edin, kabul etmek bana SO'da bir miktar kredi verecektir. –

İlgili konular