从GCC 3.1.2到4.2.2的端口编码正在中断

时间:2010-11-22 04:38:27

标签: c++

    // Standard Template Library example
#include <iostream>
#include <list>
using namespace std;
// Simple example uses type int
main()
{
    list<int> L;
    L.push_back(0);              // Insert a new element at the end
    L.push_front(0);             // Insert a new element at the beginning
    L.insert(++L.begin(),2);     // Insert "</span><span title="Convert this amount" class="currency_converter_link">2</span><span class="currency_converter_text">" before position of first argument
                                // (Place before second argument)
    L.push_back(5);
    L.push_back(6);

    static list<int>::iterator itr = 0 ;

    if(itr == L.end())
    {
        cout <<"itr is equal to NULL;)" ;
    }
    else 
    {
         cout <<"Not NULL ";
    }


    for(itr=L.begin(); itr != L.end(); ++itr) 
        cout << *itr << " ";

    cout << endl;
    return 0;
}

我有很简单的代码,抛出一个简单的错误。

iterator.cpp:16:29: error: conversion from 'int' to non-scalar type 'std::list<i
nt>::iterator' requested

我对C ++很陌生,处理这个错误的最佳方法是什么,以便代码可以很好地编译。 仅供参考,当您将相同的代码从GCC 3.1.2切换到4.2.2时,它的移植问题。 基本上整个问题围绕一行编织

static list<int>::iterator itr = 0 ;
好像有人指导我阅读有关这些迭代器的好文档。由于旧的海湾合作委员会正在接受这些事情或只是发出警告,但现在他们正在考虑这个和错误。 我很好奇,因为我们将NUL分配给指针并与NULL进行比较,所以当涉及到迭代器时,它是等价的。

请帮助。 谢谢......

3 个答案:

答案 0 :(得分:2)

更改如下:

   static list<int>::iterator itr = 0 ; 

   static list<int>::iterator itr = L.begin() ; 

BTW,为什么这被声明为静态局部变量?

答案 1 :(得分:1)

只需删除显式初始化(​​另外,删除后续的if - else)。

当迭代器实际上是指针时,初始化= 0可以工作,因为编译时常量整数0被视为空指针常量。

当迭代器不是指针类型时,它不需要支持那种初始化。

干杯&amp;第h。,

答案 2 :(得分:0)

首先,错误:

iterator.cpp:16:29: error: conversion from 'int' 
  to non-scalar type 'std::list<i nt>::iterator' requested

您看到此消息是因为您尝试在此行中将iterator初始化为int

static list<int>::iterator itr = 0 ;

编译器不知道如何将int转换为iterator - 因此错误。不确定为什么你已将iterator声明为static - 我认为没有理由这样做。 (这不是错误的原因,但在这里没有任何意义。)

继续,这段代码:

if(itr == L.end())
{
    cout <<"itr is equal to NULL;)" ;
}
else 
{
     cout <<"Not NULL ";
}
就我而言,......并没有多少用处。您刚刚使用iterator初始化了0,那么为什么要测试它的价值呢?

我建议删除if-else语句,并在for循环范围内初始化迭代器,如下所示:

int main()
{
    list<int> L;
    L.push_back(0);              
    L.push_front(0);             
    L.insert(++L.begin(),2);     

    L.push_back(5);
    L.push_back(6);

    for(list<int>::iterator itr = L.begin(); itr != L.end(); ++itr) 
       cout << *itr << " ";

    cout << endl;
    return 0;
}