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
과 붙어 있습니까?
너는 붙어있다. iterator *와 * 스마트 포인터의 참조를 해제해야한다. – juanchopanza
@juanchopanza 수치심, 빠른 답장을 보내 주셔서 감사합니다. 사람들이 장소를 역 참조하거나 다른 방법으로 코드를 구조화하는 것입니까? – dutt
사람들은 "어딘가에서"포인터를 사용해서는 안됩니다. 여기에는 스마트 포인터가 포함됩니다. 스마트 포인터를 사용하여 "모든 곳"은 IMO 전체에서 원시 포인터를 사용하는 것보다 약간 낫습니다. 동적 할당을 사용하면 스마트 포인터 클래스로 전환하여 본질적으로 더 나은 것으로되지는 않습니다. –