Boost logo

Boost :

From: Giovanni Piero Deretta (gpderetta_at_[hidden])
Date: 2008-05-19 10:21:17


On Mon, May 19, 2008 at 8:02 AM, Emil Dotchevski
<emil_at_[hidden]> wrote:
>> Am Sonntag 18 Mai 2008 19:28:42 schrieb Giovanni Piero Deretta:
>> > On Sun, May 18, 2008 at 3:52 PM, Maik Beckmann
>> > I'm not a guru, but Instead of a vector<shared_ptrs<T> >, I'have used
>> > a shared_ptr <vector<T> > to implement recursive data structures. A
>> > clone pointer would work even better.
>>
>> Giovanni, very nice!
>
> A standard conforming compiler is allowed to reject std::vector<T> for
> incomplete T.

Are you sure about it? I think that the standard says (I do not have
it, I'm looking at the last draft):

"In particular, the effects are undefined in the
following cases: if an incomplete type is used as a template argument when
instantiating a template component."

I'm not a language lawyer, but does boost::shared_ptr<vector<T> >
count as an instantiation?

The definition of (implicit) template instantiation in the draft I
have (14.7.1) says:

"Unless a class template specialization has been explicitly
instantiated (14.7.2) or explicitly specialized (14.7.3), the
class template specialization is implicitly instantiated when the
specialization is referenced in a context that requires a
completely-defined object type or when the completeness of the class
type affects the semantics of the program. "

In particular the example in this section shows that creating a
pointer to a template specialization does not require an
instantiation.

Boost shared_ptr explicitly allows its parameter to be incomplete, so
it will definitely not be used in a context that requires a completely
defined object. The boost::shared_ptr constructor is another story of
course.

-- 
gpd

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk