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

나는 할당에 대한 루프의 자리에 for_each 루프를 사용하는 것을 시도하고있다."해결되지 않은 오버로드 된 함수 타입"C에서 반복자 및 기능의 for_each 사용하는 동안은 ++

나는이 오류 메시지가 무엇입니까 왜 확실하지 오전 :

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>)â 

답변

16

쓰기 :

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

또는 :

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

나는이 문제를 너무 여러 번에 직면 한을 그 내 코드뿐만 아니라 다른 코드에서도이 문제를 해결하는 데 지쳤습니다.

코드가 작동하지 않는 이유 이유 : 이름을 해석 할 때 문제의 원인이되는 공간 std의 다른 오버로드 기능 tolower이 컴파일러는 단순히 통과 할 때, 당신이 참조하고 과부하를 결정할 수 없기 때문에 tolower . 컴파일러가 오류 메시지에 unresolved overloaded function type을 말하면서 과부하가 있음을 나타냅니다.

그래서 올바른 과부하 해결하는 컴파일러를 돕기 위해, 당신은 그 컴파일러는 다른 방법으로, 될 수있는 글로벌 tolower 기능을 선택하기 위해 힌트를 얻을 수 tolower

(int (*)(int))tolower 

로 캐스팅했습니다 서면으로 작성 ::tolower.

1. 코드에 using namespace std을 적어 두었을 것입니다. 나는 또한 그렇게하지 말 것을 제안합니다. 일반적으로 정규화 된 이름을 사용하십시오. 그런데


, 난 당신이 그렇다면, std::for_each 그렇게하지 않는다면, 소문자로 입력 문자열을 변환 할 생각합니다. 당신은 당신의 코드 어딘가에 using namespace std;

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

너무 감사합니다! 불행히도이 클래스는 STL 클래스이며 아직 변환을 사용하지 않아야합니다. – bluetickk

+0

입력 문자열을 내부 수정하려면 'std :: for_each'에 자신의 함수를 제공 할 수 있습니다. [이것 같이] (http://ideone.com/3V7CN). –

+1

@bluetickk :하지만 당신은 어쨌든'std :: for_each'를 사용하고 있습니다. 왜'std :: transform'을 사용할 수 없습니까? – Nawaz

0

1) : 당신은 std::transform 기능을 사용했습니다. std 네임 스페이스 전체를 가져올 위험성은 사용자가 무엇을 얻고 있는지 반드시 알 필요가 없다는 것입니다. 이 경우 std::tolower의 오버로드를 가져 왔습니다.

교과서 나 강사가 알려 주더라도 using namespace std;을 입력하지 마십시오.

2) std::transform를 사용하여 제한되어 있기 때문에, 당신은 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; 
}