重載函數我下面O'Reilly出版的書C++食譜和我嘗試的一個例子,這裏是代碼:沒有編制
#include <string>
#include <iostream>
#include <cctype>
#include <cwctype>
using namespace std;
template<typename T, typename F>
void rtrimws(basic_string<T>& s, F f){
if(s.empty())
return;
typename basic_string<T>::iterator p;
for(p = s.end(); p != s.begin() && f(*--p););
if(!f(*p))
p++;
s.erase(p, s.end());
}
void rtrimws(string& ws){
rtrimws(ws, isspace);
}
void rtrimws(wstring& ws){
rtrimws(ws, iswspace);
}
int main(){
string s = "zing ";
wstring ws = L"zonh ";
rtrimws(s);
rtrimws(ws);
cout << s << "|\n";
wcout << ws << "|\n";
}
當我嘗試編譯它,我得到以下錯誤
trim.cpp: In function ‘void rtrimws(std::string&)’:
trim.cpp:22: error: too many arguments to function ‘void rtrimws(std::string&)’
trim.cpp:23: error: at this point in file
我不明白什麼是錯的。如果我不使用字符版本(字符串),而只使用wchar_t版本,則一切運行平穩。
順便說,我使用的克++ 4.4.3在Ubuntu機64個比特
順便說一下,它在VC++上編譯得很好 – 2010-09-09 19:20:44
+1:好問題 – Chubsdad 2010-09-10 01:43:19
在關閉此線程之前,爲了學習更多一點,我想討論一些事情。該代碼當然在VC++編譯,我沒有任何問題嘗試,但它不在GCC。函數isspace在cctypes.h中聲明爲__exctype(isspace);這是真正的extern int isspace(int)throw() – Sambatyon 2010-09-11 08:16:58