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;

}

编译和工作正常。

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

编译和工作正常。

- -编辑 - -

奖金问题:)

定义变量的两种方式在 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)) );

The parentheses introduced make the compiler regognize that it should instead construct an object p initialized from an expression (because a function parameter declaration can't have parentheses around it, it's not parsed as a parameter declaration, but instead as an initializer).

于 2010-05-30T14:04:00.820 回答