в следующем коде:
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>>> ’требуется
спасибо большое!