2010-04-06 4 views
3

나는 추상 기본 클래스 A와 10 개의 파생 클래스 집합을 가지고 있습니다. 중위 연산자 기본 클래스 포인터를 저장하는 용기가 파생 된 클래스부스트 바인딩 함수

class A{ 
public: 
    void printNode(std::ostream& os) 
    { 
      this->printNode_p(); 
    } 
    protected: 
    virtual void printNode_p(std::ostream& os) 
    { 
      os << (*this); 
    } 
}; 

모든 오버로드된다. boost :: bind 함수를 사용하여 각각의 파생 클래스에서 중첩 된 중위 연산자를 호출하려고합니다. 나는 이렇게 작성했습니다

std::vector<A*> m_args 
.... 
std::ostream os; 
for_each(m_args.begin(), m_args.end(), bind(&A::printNode, _1, os)); 

이 코드의 문제점은 무엇입니까? Visual Studio에서 나는이

오류 C2248과 같은 오류가 점점 오전 : '표준 : basic_ios < _Elem, _Traits> :: basic_ios'을 : 클래스 '표준 : basic_ios에 선언 개인 회원 에 액세스 할 수 없습니다 < _Elem, _Traits> '

감사합니다, Gokul.

+0

이 문제는 무엇입니까? 컴파일하지 않거나 원하는 것을하지 않습니까? –

+0

@Alex : 오류가있는 게시물을 – Gokul

답변

5

는 예상대로 작동하는, 이것을 고려 :

#include <iostream> 

struct base 
{ 
    virtual ~base(void) {} 

    virtual void print(std::ostream& pStream) = 0; 
}; 

struct foo : base 
{ 
    void print(std::ostream& pStream) { pStream << "foo" << std::endl; } 
}; 

struct bar : base 
{ 
    void print(std::ostream& pStream) { pStream << "bar" << std::endl; } 
}; 

#include <boost/bind.hpp> 
#include <boost/ptr_container/ptr_vector.hpp> 
#include <algorithm> 

int main(void) 
{ 
    boost::ptr_vector<base> v; 
    v.push_back(new foo); 
    v.push_back(new bar); 

    std::for_each(v.begin(), v.end(), 
        boost::bind(&base::print, _1, boost::ref(std::cout))); 
} 

우선 해제, 당신은 부스트를 사용하고 있기 때문에 당신은뿐만 아니라 당신을 위해 메모리 관리를 처리하기 위해 ptr_vector를 사용할 수 있습니다. 그래서 거기에 있습니다.

두 번째로는 스트림을 복사 할 수 없으므로 오류가 발생했습니다.; 그러나 boost::bind은 펑터를 만들 때 모든 인수를 복사합니다. 복사 가능한 boost::reference_wrapper (boost::ref 유틸리티 기능 사용)에 포장하십시오. 시간이되면 래퍼가 필요한 유형으로 변환되며 차이점을 알 수 없습니다.

#include <boost/foreach.hpp> 
#include <boost/ptr_container/ptr_vector.hpp> 
#include <algorithm> 

#define foreach BOOST_FOREACH 

int main(void) 
{ 
    boost::ptr_vector<base> v; 
    v.push_back(new foo); 
    v.push_back(new bar); 

    foreach (base* b, v) 
    { 
     v->print(std::cout); 
    } 
} 
+0

으로 업데이트했습니다. 감사합니다 .... 나는 boost :: ptr_vector를 살펴볼 것입니다. – Gokul

0

문제 :

(.이 위해 만들어진 boost::ref 상황 중 하나입니다) 모든 말했다


, 내 의견으로는 깨끗한 코드를 생성 BOOST_FOREACH를 사용하는 것을 고려 그 std :: ostream 복사 할 수 없습니다. 나는이

for_each(m_args.begin(), m_args.end(), bind(&A::printNode, _1, boost::ref(os))); 

감사합니다, Gokul처럼 고정.

관련 문제