Re: boost:shared_ptr cast problem
Jun wrote:
Hello,
I've code like :
===========================================
class A{
public :
// create print content
friend std::ostream& operator<< (std::ostream&
os, const A& a);
}
typedef boost::shared_ptr<A> APtr; // Define A class smart pointer
APtr aPtr1(new A());
APtr aPtr2(new A());
APtr aPtr3(new A());
vector<APtr> AVec;
AVec.push_back(aPtr1);
AVec.push_back(aPtr2);
AVec.push_back(aPtr3);
std::copy(AVec.begin(),AVec.end(),
std::ostream_iterator<APtr>(std::cout, "\n"));
std::copy(AVec.begin(),AVec.end(),
std::ostream_iterator< share_ptr<A> >(std::cout, "\n"));
===========================================
The two copy methods only output the address of pointers, they could
just print the class A defined print contents.
Why would you expect that? Consider
int i = 5;
std::cout << i << std::endl
<< &i << std::endl;
You would expect the second line to print an address, would you not? Why
should shared_ptr<> behave differently? Also note that shared_ptr could
have null value. In that case, there is no pointee that could be printed
instead of an address.
And following code works :
===========================================
vector<APtr>::iterator i = AVec.begin();
for(; i!= AVec.end(); ++i){
cout << *static_cast<APtr>(*i) << endl;
}
===========================================
Anyone has some ideas for that ?
Yes, leave out the cast: *i is already of type APtr.
cout << *(*i) << endl;
BTW: I have the feeling that I did not really understand what the real
problem is that you want to solve. Maybe, you oversimplified it for the
purpose of the post. Could you provide a little background as to _why_ you
want to print the shared_ptr and _why_ you feel it would be the
RightThing(tm) if that printed the pointee instead of an address? Maybe, it
is the context of the underlying problem that makes you think printing the
pointee would be right. In that case, it would be good to share the
underlying problem with us, because it might have a well known solution.
Best
Kai-Uwe Bux