在以下代码中:
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;
}
编译并正常工作。
根据Glib :: ustring文档和include文件,可以从std::string
迭代器构造ustring迭代器,并定义operator++()
。不可思议?
--- --- EDIT
获得“Curiouser和curiouser”!这段代码
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> >'到 非标量类型 “油嘴:: ustring_Iterator< __ gnu_cxx :: __ normal_iterator, std :: allocator> > >'requesed
非常感谢!
答案 0 :(得分: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
(因为函数参数声明不能在它周围有括号,它不被解析为参数声明,而是作为初始化者)。