2017-12-27 65 views
-3

벡터로 구현 된 목록을 사용하여 벡터로 잘 작동하는 동안 오류가 발생합니다. c2227 -> set_as_output의 목록이 클래스/구조체/공용체/제네릭 유형을 가리켜 야합니다. . 나는 목록이 문제를 해결하기 위해 우려로까지 내 코드에없는 것을 구현 목록 및 벡터 사이의 차이이며, 무엇을 배우고 싶었다목록과 벡터의 색인 생성 사이의 차이

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

표준 : : 목록은 [] 연산자 같은 것들을 통해 랜덤 액세스를 지원하지 않습니다 그리고 당신은 (*iter)->set_as_input()와 함께했던 것처럼 당신은 반복자는 포인터를 얻는 역 참조 할 필요가있다. 이 내용은 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은 구성원 함수입니다. 당신은 그것을 불러야 만합니다.

(*pins_.begin())->set_as_output();