2011-09-23 11 views
8
//for(unsigned int i=0; i < c.size(); i++) tolower(c[i]); 
for_each(c.begin(), c.end(), tolower); 

Sto cercando di utilizzare un ciclo for_each al posto del ciclo for per un incarico."Non risolto sovraccarico tipo di funzione" durante il tentativo di utilizzare for_each con iteratori e la funzione in C++

non sono sicuro perché sto ottenendo questo messaggio di errore:

In function âvoid clean_entry(const std::string&, std::string&)â: 
prog4.cc:62:40: error: no matching function for call to âfor_each(std::basic_string<char>::iterator, std::basic_string<char>::iterator, <unresolved overloaded function type>)â 

risposta

16

scrittura:

for_each(c.begin(), c.end(), ::tolower); 

Oppure:

for_each(c.begin(), c.end(), (int(*)(int))tolower); 

Ho affrontato questo problema così tante volte che Sono stanco di sistemarlo nel mio codice, così come nel codice degli altri.

Motivo per cui il codice non funziona: non c'è un'altra funzione sovraccaricata tolower nello spazio dei nomi std che sta causando problemi durante la risoluzione del nome, perché il compilatore non è in grado di decidere quale sovraccaricare ti riferisci, quando semplicemente passa tolower . Questo è il motivo per cui il compilatore sta dicendo unresolved overloaded function type nel messaggio di errore, che indica la presenza di overload (s).

Quindi, per aiutare il compilatore a risolvere al sovraccarico corretta, devi lanciare tolower come

(int (*)(int))tolower 

poi il compilatore ottiene il suggerimento per selezionare la tolower funzione globale, che in altri modi, può essere utilizzato scrivendo ::tolower.

1. Immagino che tu abbia scritto using namespace std nel tuo codice. Ti suggerirei anche di non farlo. Utilizza nomi completi in generale.


A proposito, penso che si desidera trasformare la stringa di input in minuscolo, in caso affermativo, allora std::for_each sarebbe non farlo. Hai per usare std::transform funzione di:

std::string out; 
std::transform(c.begin(), c.end(), std::back_inserter(out), ::tolower); 
//out is output here. it's lowercase string. 
+0

grazie mille! Sfortunatamente questa è una classe STL e non dovevamo ancora usare la trasformazione. – bluetickk

+0

Se vuole modificare la stringa di input sul posto, può fornire la propria funzione a 'std :: for_each'. [Mi piace questo] (http://ideone.com/3V7CN). –

+1

@bluetickk: Ma stai usando 'std :: for_each' in ogni caso. Perché non puoi usare 'std :: transform'? – Nawaz

0

1) Hai using namespace std; da qualche parte nel codice. Il pericolo di importare l'intero spazio dei nomi std è che non si sa necessariamente cosa si sta ottenendo. In questo caso, sono stati importati sovraccarichi di std::tolower.

Non digitare mai using namespace std;, anche se il tuo manuale o il tuo istruttore ti dicono di farlo.

2) Dal momento che si sono limitati dall'utilizzo di std::transform, è possibile modificare la stringa in posizione utilizzando std::for_each:

#include <cctype> 
#include <algorithm> 
#include <string> 
#include <iostream> 

void 
MakeLower(char& c) 
{ 
    c = std::tolower(c); 
} 

int 
main() 
{ 
    std::string c("Hello, world\n"); 
    std::for_each(c.begin(), c.end(), MakeLower); 
    std::cout << c; 
} 
Problemi correlati