2010-11-22 3 views
0
// 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; 
} 

私は非常にシンプルで簡単なエラーを投げています。GCC 3.1.2から4.2.2への移植時にコードが壊れている

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 ; 

ある1行を中心に編成されます。古いGCCがこれらのことを受け入れるか、ただ警告を投げていたので、今、彼らはこれとエラーを考えています。 NULをポインタに割り当て、NULLと比較すると、イテレータになると同等であることが不思議です。

助けてください。 ありがとう...

+0

私は「破壊」は、あなたのコード内で – Chubsdad

+4

ままの警告音を聞くことができています何かが間違っているという良い兆候です。警告は、コードが移植性がない可能性があることを意味します。警告は通常論理的なエラーです(構文上/意味上のエラーではないにしても)、すべての警告をエラーとして扱います(そして、警告レベルを(合理的に)可能な限り高くしてください) –

+0

なぜイテレータはNULLになりますか?そのイテレータはポインタではありません(その下には、実装の詳細を示すポインタがありますが、これは間違いなく頼りにしてください)。 –

答えて

1

明示的な初期化を削除してください(さらに、後に続くif - elseを削除してください)。

イニシャライザ= 0は、イテレータが実際にポインタであるときに動作します。コンパイル時定数の整数0がnullポインタ定数として扱われるためです。

イテレータがポインタ型でない場合、そのような初期化をサポートする必要はありません。

乾杯& HTH、

+0

しかしiteratorです。イテレータの実装の詳細を考慮する必要はありません(そうしないと、カプセル化の原則が破られています)。 –

+0

@Martin:反復子は反復子です。はい、一般的に実装の詳細に頼るべきではありません。最初は無意味な同音異義語です(あなたはFB Tautology Clubと考えましたか?)、そして2番目は無意味な一般化です。要するに、あなたが書いたものは、技術的に無意味な巨大なジャンボですが、技術者でない読者にとっては、何かを指摘するという印象を伝えています。 –

+0

@マーティン:あなたの結論まで、あなたは私の答えを詳述しています。たとえば、「サポートする必要はありません」と書いたところでは、「必要はありません」と書いています。それであなたは*私が何か他のことを書いたことを暗示する*。嘘をつかない。なぜあなたは横たわっていますか? –

2

変更し、次のように:。

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

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

にところで、なぜこれは、静的ローカル変数として宣言されていますか?

まず
+0

+1はなぜ静的な発言なのですか?私は同じことが不思議だった。 –

+0

-1(このコードでは)イテレータを明示的に初期化する必要はありません。これはループ内で再び初期化されます。私の答えに書いたように、明示的な初期化(そしてそれに続く '' if''の効果のチェック)だけをベストにするだけです。 –

+0

これはおそらくリストの始まりである妥当なデフォルト値に初期化する方法を示していました。(リスト::イテレータのデフォルトのコンストラクタを使用するのではなく) – Chubsdad

0

、エラー:

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

あなたはこの行のintiteratorを初期化しようとしているので、あなたはこれを見ている:

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

コンパイラが認識していませんintiteratorに変換する方法 - エラーです。 iteratorstaticと宣言した理由がわかりません。そうする理由はありません。 (それがエラーの原因ではないのですが、それはここでは意味がありません。)

が上に移動すると、このコード:

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

...は、私に関する限り多くの目的を果たしていません。 を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; 
} 
関連する問題