次のコードで:
int utf8len(char* s, int len)
{
Glib::ustring::iterator p( string::iterator(s) );
Glib::ustring::iterator e ( string::iterator(s+len) );
int i=0;
for (; p != e; p++) // ERROR HERE!
i++;
return i;
}
行にコンパイラ エラーが表示されますfor
。これは、「インクリメントで無効な左辺値」である場合もあれば、「ISO C++ は型などのポインターのインクリメントを禁止している...」である場合もあります。
それでも、次のコード:
int utf8len(char* s)
{
Glib::ustring us(s);
int i=0;
for (Glib::ustring::iterator p = us.begin(); p != us.end(); p++)
i++;
return i;
}
コンパイルして正常に動作します。
std::string
Glib::ustring のドキュメントとインクルード ファイルによると、ustring イテレータはイテレータから構築でき、operator++()
定義されています。変?
- -編集 - -
「好奇心旺盛・好奇心旺盛」に!このコード
int utf8len(string::iterator s, string::iterator e)
{
Glib::ustring::iterator p(s);
Glib::ustring::iterator end(e);
int i=0;
for (; p != end; p++)
i++;
return i;
}
コンパイルして正常に動作します。
- -編集 - -
ボーナス質問:)
変数を定義する2つの方法の間にC ++の違いはありますか:
classname ob1( initval );
classname ob1 = initval;
私はそれらが同義であると信じていました。それでも、私が変われば
Glib::ustring::iterator p( string::iterator(s) );
に
Glib::ustring::iterator p = string::iterator(s);
コンパイラ エラーが発生します (gcc 4.1.2)
'__gnu_cxx::__normal_iterator, std::allocator > >' から非スカラー型 'Glib::ustring_Iterator<__gnu_cxx::__normal_iterator, std::allocator > > >' への変換が要求されました
どうもありがとう!