2013-06-05 6 views
0

나는 한 쌍의 반복자를 받아들이는 함수 객체에 copy_if를 바인딩하고있다. 나는 현지 주소 나 임시 주소를 반환 할 것이라는 경고를 받는다.이 템플릿 코드에서 로컬 또는 임시 반환하는 방법을 수정하려면 어떻게합니까?

나는 이터레이터의 std :: pair 쌍의 바인딩 멤버 변수로부터 오는 정보를 알고 있지만,이를 수정하는 방법을 모른다. 나는 그들이 왜 처음부터 일시적인 것으로 간주되는지 이해하지 못합니다. 누군가 나에게 설명 할 수 있습니까?

다음은 관련 코드입니다. 환경은 Visual Studio 2010 Ultimate이며 덜 유용한 Windows 7 Enterprise입니다.

std::vector<My_Type *> destination_container; 

typedef /*A boost multi index iterator that dereferences to a 'My_Type *' */ t_range_iterator; 
typedef std::pair<t_range_iterator, t_range_iterator> t_equal_range; 
typedef std::function<bool(My_Type *)> t_predicate; 
typedef std::back_insert_iterator<std::vector<My_Type *>> t_inserter; 

t_predicate predicate(std::bind(&My_Type::pred, std::placeholders::_1, SOME_CONST)); 

std::function<t_inserter(const t_equal_range)> do_copy_from(std::bind(&std::copy_if<t_range_iterator, t_inserter, t_predicate> 
    , std::bind(&t_equal_range::first, std::placeholders::_1) 
    , std::bind(&t_equal_range::second, std::placeholders::_1) 
    , std::back_inserter(destination_container) 
    , predicate)); 

그리고 나중에 코드는 다음과 같이 일을 할 것입니다 :

do_copy_from(return_me_an_equal_range_of_My_Type_ptr()); 
do_copy_from(get_me_another_equal_range()); 
do_copy_from(and_so_on_dot_dot_dot()); 
+0

구조 연산자() 함수를 사용하여 구조체를 사용하지 않으시겠습니까? –

+0

제안 해 주셔서 감사합니다. 실용적이야. 이 문제를 해결하기 위해 할 수있는 일이 몇 가지 있지만, 나는 그들을 우아하다고 생각하지 않습니다. 궁극적으로, 나는 아마도 그러한 해결책을 사용하고 나의 삶과 함께 나아갈 것이다. 하지만이 문제는 내가 이해하기를 원했던 이해가 부족함을 보여 주므로 여기서 다시 돌아와이 질문을하지 않아도됩니다. –

답변

0

하지 한 정도로 코드를. 그러나 그것은 추측 하건데 그것은 destination_container 컨테이너가 로컬 인 이고 back_inserter가이 컨테이너에 대한 참조를 유지하기 때문입니다.

+0

나는 이전에 당신이 의견을 말했지만 당신과 의견이 맞지 않았지만 지금은 확신이 없습니다 ... 그러나 왜 지역에 대한 언급은 나쁜 것입니까? 컨테이너가 함수 객체의 수명이 다할 때까지 범위를 벗어나는 것은 아닙니다. 뒤쪽 삽입 장치에 저장된 참조가 범위를 벗어나는 것을 의미합니까? –

+0

범위에서 함수 오브젝트가 리턴 된 경우, 예. – Dan

+0

그러나 나는 그런 일이 일어나지 않는다는 것을 안다. 그것은 또한 부스트 멀티 인덱스 반복자의 구현에 묻힐 수도 있습니다. * 나는 * 정말로 * 읽고 싶지 않습니다. 제가 제게 어떤 인상을주는 것을 좋아하지만, 템플리트 메타 프로그래밍은 읽을 고통입니다. – Dan