в следующем коде:
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++(). Странный?
---РЕДАКТИРОВАТЬ---
Становится все страньше и страньше! этот код
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;
}
компилируется и работает нормально.
---РЕДАКТИРОВАТЬ---
БОНУСНЫЙ ВОПРОС :)
Есть ли разница в С++ между двумя способами определения переменной:
classname ob1( initval );
classname ob1 = initval;
Я считал, что они синонимы; все же, если я изменю
Glib::ustring::iterator p( string::iterator(s) );
to
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 > > >’
большое спасибо!