We All Get Old - Naskin Diary

Yet Another My Life On The Web

C++調理メモ

解決すべき課題リスト。
C++マイスターへの道は遠し。

環境

OS:FreeBSD 6.2-Release/amd64
Compiler:g++4.0.4、4.1.3、3.4.6

例3-4/未解決

string を引数とする関数でコンパイルエラー。
引数を二つ持つ関数のオーバーロードが出来ずに
自分(関数)を再帰的に呼び出そうとしてして引数過多?
wstring を引数にしている関数はオーバーロードできている模様。

error: too many arguments to function `void rtrimws(std::string&)'
error: at this point in file

例3-8/解決

例外「out_of_range」は #include を宣言しないと catchできない。

例3-9/解決(2007/7/15追記)

for_each 呼び出し箇所でコンパイルエラー発生。

no matching function for call to `for_each(std::_List_iterator, std::_List_iterator, )'

ネットを見る限り普通の関数を for_each には渡せなさそう。
(Template 宣言したり細工が必要そう)


解決策
レシピ5.5(例5-5)で出てくるファンクタを使って解決

/* Original
void write(const string &s) {
    cout << s << '\n';
}
*/

template<typename T>
struct printer {
    void operator() (const T &s) {
        cout << s << '\n';
    }
};
printer<string> strPrinter;
   ...
int main() {
   ...
    //for_each(lst.begin(), lst.end(), write);      // Original
    for_each(lst.begin(), lst.end(), strPrinter);
}


例3-11/解決(2006/6/10追記)

変数n と i に typename が宣言されていないため、コンパイルエラー発生。

template<typename T>
void removeSubstrs(basic_string<T>& s,
                    const basic_string<T>& p) {
    typename basic_string<T>::size_type n = p.length();

    for (typename basic_string<T>::size_type i = s.find(p);
            i != basic_string<T>::npos;
            i = s.find(p)) {
        s.erase(i, n);
    }
}