не может увеличить Glib :: ustring :: iterator (получение ошибки «недопустимое значение lvalue в приращении») - PullRequest
0 голосов
/ 30 мая 2010

в следующем коде:

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, которая иногда является "недопустимым lvalue в приращении", а иногда "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;

}

компилируется и отлично работает.

в соответствии с документацией Glib :: ustring и включаемым файлом, итератор ustring может быть создан из std::string итератора, и для него определено operator++(). Weird?

--- EDIT ---

Получается "Любопытнее и страннее"! этот код

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;
}

компилируется и отлично работает.

--- EDIT ---

БОНУСНЫЙ ВОПРОС:)

Есть ли разница в 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>> ’to нескалярный тип «Glib :: ustring_Iterator <__ gnu_cxx :: __ normal_iterator, std :: allocator>>> ’требуется

спасибо большое!

1 Ответ

3 голосов
/ 30 мая 2010

Ваша декларация объявляет эту функцию:

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, инициализированный из выражения (поскольку объявление параметра функции не может иметь круглых скобок вокруг него, оно не анализируется как объявление параметра, а вместо этого как инициализатор).

...