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

割り当てのforループの代わりに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); 

かを私はこのコードを他のコードと同様に修正することに飽き飽きしています。

理由コードが機能しない理由:別のオーバーロードされた関数tolowerがネームスペースstdにあります。名前を解決する際に問題を引き起こしています。コンパイラは、あなたが過負荷と判断することができないため、 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; 
} 
関連する問題