2013-05-29 97 views
3
typedef std::vector<std::string> TVector; 
    TVector a_list; 

    populate vector... 
    for_each(a_list.begin(),a_list.end(),std::toupper); 

錯誤C++字符串

no matching function for call to 'for_each(std::vector<std::basic_string<char> >::iterator, std::vector<std::basic_string<char> >::iterator, <unresolved overloaded function type>) 

我需要迭代使用用於循環的一個標準的元件的每個矢量?還是有另一種方式我不允許使用c + + 11功能。

感謝

+0

爲(TVector ::迭代器I = a_list.begin(),a_list.end(); + +1){ std :: transform(i-> begin(),i-> end(),i-> begin(),:: toupper); } – gda2004

回答

4

toupper功能用於字符,而不是字符串。它也返回的大寫字符,所以不會與for_each,但會與std::transform。還有兩個重載中存在std::toupper的問題,編譯器無法決定使用哪一個。包括<cctype>並使用普通的toupper(或可選::toupper)來獲得正確的功能。

您需要首先遍歷向量中的所有字符串,然後再次遍歷字符串以調用toupper

您可以做手工,或使用transform和使用functor objects,像

struct strtoupper 
{ 
    std::string operator()(const std::string& str) const 
    { 
     std::string upper; 
     std::transform(str.begin(), str.end(), std::back_inserter(upper), ::toupper); 
     return upper; 
    } 
}; 

// ... 

std::transform(a_list.begin(), a_list.end(), a_list.begin(), strtoupper()); 
3

你的std::stringstd::toupper矢量需要一個char作爲參數。所以它不能使用。你可以做的是:

std::for_each(list.begin(), list.end(),[](std::string& s) { std::for_each(s.begin(), s.end(), std::toupper);});

2

std::toupper是一個重載函數;這就是爲什麼你會在錯誤消息中獲得<unresolved overloaded function type>。要選擇一個特定的過載,你需要將其強制轉換:

static_cast<int(*)(int)>(std::toupper) 

for_each也沒有完成這個任務,它會調用toupper列表中的每個字符串,然後丟棄其結果是正確的選擇。 std::transform將是合適的選擇 - 它將其輸出寫入輸出迭代器。但是,toupper適用於字符,不適用於字符串。你仍然可以使用transform字符串中的調用toupper每個字符:

std::transform(
    a_string.begin(), 
    a_string.end(), 
    a_string.begin(), 
    static_cast<int(*)(int)>(std::toupper) 
); 

它可能會更清楚在這個簡單的情況下,使用循環:

for (TVector::iterator i = a_list.begin(), end = a_list.end(); i != end; ++i) { 
    for (std::string::size_type j = 0; j < i->size(); ++j) { 
     (*i)[j] = toupper((*i)[j]); 
    } 
} 

但是,如果你想將它與寫只有<algorithm><iterator>工具,你可以做一個仿函數:

struct string_to_upper { 
    std::string operator()(const std::string& input) const { 
     std::string output; 
     std::transform(
      input.begin(), 
      input.end(), 
      std::back_inserter(output), 
      static_cast<int(*)(int)>(std::toupper) 
     ); 
     return output; 
    } 
}; 

// ... 

std::transform(
    a_list.begin(), 
    a_list.end(), 
    a_list.begin(), 
    string_to_upper() 
);