2014-03-30 2 views
0

어딘가에서 읽는 것을 기억하지만, 그 연산자가 일시적이라는 것을 기억하지 못합니다. 그것은 포인터가 아닌 무언가를 발견하고 정상적인 연산자를 실행할 때까지 operator->를 가진 객체를 살펴볼 것입니다. 그걸로. 나는 그러나 Operator-> transistency 및 shared_ptr

이 코드를 고려,이 문제에 실행 한 :

#include <boost/shared_ptr.hpp> 
#include <vector> 
#include <iostream> 

struct Foo { 
    Foo(int val) : i(val) {} 
    typedef boost::shared_ptr<Foo> ptr; 
    int i; 
}; 

int main(int argc, char** argv) { 
    typedef std::vector<Foo::ptr> FooVec; 
    FooVec v; 
    for(FooVec::iterator it = v.begin(); it != v.end(); ++it) { 
     std::cout <<it->i <<std::endl; 
    } 
    return 0; 
} 

내가 얻을이 오류 :

ptr.cpp: In function ‘int main(int, char**)’: 
ptr.cpp:15:19: error: ‘class boost::shared_ptr<Foo>’ has no member named ‘i’ 
    std::cout <<it->i <<std::endl; 

부스트 때문에 :: shared_ptr의 포인터가 아닙니다. 내가 대신

std::cout <<(*it)->i <<std::endl 

를 작성하여이 문제를 해결할 수하지만 그 많은 더 생겼다고 생각 나뿐만 아니라 표준 : : shared_ptr을 시도하지만 같은 문제가있어. 이 문제를 해결할 수있는 좋은 방법이 있습니까? 아니면 (*it)->i과 붙어 있습니까?

+1

너는 붙어있다. iterator *와 * 스마트 포인터의 참조를 해제해야한다. – juanchopanza

+0

@juanchopanza 수치심, 빠른 답장을 보내 주셔서 감사합니다. 사람들이 장소를 역 참조하거나 다른 방법으로 코드를 구조화하는 것입니까? – dutt

+1

사람들은 "어딘가에서"포인터를 사용해서는 안됩니다. 여기에는 스마트 포인터가 포함됩니다. 스마트 포인터를 사용하여 "모든 곳"은 IMO 전체에서 원시 포인터를 사용하는 것보다 약간 낫습니다. 동적 할당을 사용하면 스마트 포인터 클래스로 전환하여 본질적으로 더 나은 것으로되지는 않습니다. –

답변

0

I recall reading somewhere, can't recall where though, that operator-> is transient.

C++에는 없습니다. 이미 발견 한 것처럼 이중 참조를해야합니다.