Boost logo

Boost :

Subject: Re: [boost] [variant] awkward recursion
From: Dave Abrahams (dave_at_[hidden])
Date: 2012-11-02 11:57:59


on Fri Nov 02 2012, Mathias Gaunard <mathias.gaunard-AT-ens-lyon.org> wrote:

> On 31/10/12 19:02, Dave Abrahams wrote:
>
>> namespace wrapper
>> {
>> struct value;
>>
>> template <class T, class U>
>> struct mymap : std::map<T,U>
>> {
>> enum { _size = sizeof(T)+sizeof(U) }; // error if T or U are incomplete
>> };
>> typedef mymap<std::string, value> object;
>
> This line instantiates the declaration of std::map<std::string,
> value>,

If by the declaration you mean

  template <class K, class V, class C, class A> struct map;

then yes.

> but not its definition, which is why you don't get any error
> (doing those sizeofs inside the declaration itself will yield errors
> though of course).

You mean like this?

--8<---------------cut here---------------start------------->8---
template <class T, class U, unsigned n = sizeof(T)+sizeof(U)>
struct mymap : std::map<T,U>
{};
--8<---------------cut here---------------end--------------->8---

If so, then, as you say... "of course."

> I'm no expert at standardese but it seems class template instantiation
> usually refers to instantiating the definition, which would mean that
> this is indeed allowed.

-- 
Dave Abrahams
BoostPro Computing                  Software Development        Training
http://www.boostpro.com             Clang/LLVM/EDG Compilers  C++  Boost

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