0

次のコードで:

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::stringGlib::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 > > >' への変換が要求されました

どうもありがとう!

4

1 に答える 1

3

あなたの宣言はこの関数を宣言します:

Glib::ustring::iterator p(string::iterator s);

コードの括弧sは無視されます。n次の例の括弧のようなものです

int(n);
n = 0; /* n is actually an int variable! */

これらは、ポインタ(*)や参照()などの修飾子をグループ化するためのものです&(について考えてみてくださいvoid(*fptr)())。あなたの場合、括弧は意味的に冗長です。

代わりにこれを試してください:

Glib::ustring::iterator p( (string::iterator(s)) );

導入された括弧により、コンパイラーは、代わりにp式から初期化されたオブジェクトを作成する必要があることを認識します(関数パラメーター宣言はその周りに括弧を含めることができないため、パラメーター宣言としてではなく、初期化子として解析されます)。

于 2010-05-30T14:04:00.820 に答える