2017-12-27 7 views
-3

ベクトルで実装されたリストを使用してコードを置き換えようとしていて、ベクトルでうまくいきましたが、エラーが表示されます - > set_as_outputのc2227リストはクラス/構造体/ 。 私はリストが問題を解決するために懸念している限り、私のコードに欠けているものを実装してリストとベクトルの差をとは​​何かを学びたいと思ったリストとベクトルのインデックス付けの差

class pin { 
    friend class gate; 
    pin(){} 
    ~pin() {} 
public: 
    void set_as_input(); 
    void set_as_output(); 

}; // class pin 


class gate { 

protected: 
    std::list<pin *> pins_; 
    //std::vector<pin *> pins_; 
    gate(); 
    ~gate(); 
    virtual bool validate_structural_semantics(); 
public: 

}; // class gate 

class and_gate : public gate 
{ 
    bool validate_structural_semantics(); 
public: 
}; // class and_gate 

bool and_gate::validate_structural_semantics() 
{ 
    if (pins_.size() < 3) return false; 
    //pins_[0]->set_as_output();//using vectors and works fine 
    pins_.begin ->set_as_output();//error is here with lists 
    //for (size_t i = 1; i < pins_.size(); ++i) 
    for (std::list<pin *>::iterator iter = pins_.begin(); 
     iter != pins_.end(); ++iter) 
     //pins_[i]->set_as_input(); 
     (*iter)->set_as_input(); 
    return true; 
} 

下の両方の実装を提供しています。 それを解決するには?

+1

のstd ::のリストは、オペレータ[]のようなものを経由してランダムアクセスをサポートしていません。これは、C++の教科書やC++のリファレンスで説明されています。 std :: listとstd :: vectorは一般に互換性がありません。 –

+0

@ Neilのコメントに加えて、あなたの教科書がそれをはっきりとカバーしていない場合は、いつでも[ここ](http://en.cppreference.com/w/cpp/container/list)を参照して、標準クラスで利用できます。 – user0042

答えて

0

リストには[]演算子がありませんが、ランダムアクセスコンテナではありません。

auto iter = std :: advance(pins_.begin()、ndx)を使用できます。リストのndx番目の要素のイテレータを取得します。

0
pins_.begin ->set_as_output(); 

beginはメンバ関数です。あなたはそれを呼び出さなければなりません。そして、ちょうどあなたがポインタを取得するイテレータを間接参照する必要があなたは(*iter)->set_as_input()でやったよう:

(*pins_.begin())->set_as_output(); 
関連する問題