Meaning of template construction



 DEVELOP > c-Plus-Plus > Meaning of template construction

LINK TO THIS PAGE  


rating :  0   |  0


  Page 1 of 1

1

 
Topic: DEVELOP > c-Plus-Plus
User: "=?ISO-8859-1?Q?Xavier_D=E9coret?="
Date: 09 Jul 2004 03:59:37 AM
Object: Meaning of template construction
I am trying to understand the meaning of this construction, found in the
CGAL library:
typedef typename Vb::template Rebind_TDS<TDS2>::Other Vb2;
Can anyone explain?
PS: I tried to reproduce this construction to see if it was what I
understood. Below is the code. Unfortunately, it crashes the compiler
(gcc version 3.3.3 20040412 (Red Hat Linux 3.3.3-7)).
.

User: "John Harrison"

Title: Re: Meaning of template construction 09 Jul 2004 05:02:02 AM
"Xavier Décoret" <Xavier.Decoret@imag.fr> wrote in message
news:cclmpu$ghp$1@trompette.imag.fr...

I am trying to understand the meaning of this construction, found in the
CGAL library:

typedef typename Vb::template Rebind_TDS<TDS2>::Other Vb2;

Can anyone explain?

Take out your favourite C++ book and look at the chapter on allocators. The
std::allocator class uses a rebind/other mechanism exactly like the one you
are looking at.
The other point to make it that typename and template are just keywords to
help the compiler disambiguate the code. Try writing it like this
typedef Vb::Rebind_TDS<TDS2>::Other Vb2;
That is not legal C++, but it might make it easier to understand.


PS: I tried to reproduce this construction to see if it was what I
understood. Below is the code. Unfortunately, it crashes the compiler
(gcc version 3.3.3 20040412 (Red Hat Linux 3.3.3-7)).

Where is the code?
john
.
User: "=?ISO-8859-1?Q?Xavier_D=E9coret?="

Title: Re: Meaning of template construction 09 Jul 2004 05:51:08 AM
John Harrison wrote:

Where is the code?

john


Thanks for the explanation. This is what I was suspected. Here is the
code (forgot it in my post).
class Object
{
class Drawer
{
public:
template <int dim>
class Projector
{
class Basis
{
float e[dim][3];
};
};
};
};
typedef typename Object::template Drawer<2>::Basis Vb2;
int
main()
{
}
.
User: "John Harrison"

Title: Re: Meaning of template construction 09 Jul 2004 06:05:00 AM
"Xavier Décoret" <Xavier.Decoret@imag.fr> wrote in message
news:ccltas$nng$1@trompette.imag.fr...

John Harrison wrote:

Where is the code?

john


Thanks for the explanation. This is what I was suspected. Here is the
code (forgot it in my post).


class Object
{
class Drawer
{
public:
template <int dim>
class Projector
{
class Basis
{
float e[dim][3];
};
};
};
};


typedef typename Object::template Drawer<2>::Basis Vb2;

int
main()
{
}

There a few things wrong with that code.
1) It's Drawer that need to be the template
2) Not sure what Projector is doing
3) Drawer is private, should be public
4) You don't need to say typename because you aren't defining Vb2 inside a
template. The ambiguity that typename resolves only applies when compiling
templates.
5) I'm less sure of this but I think you can drop the template keyword as
well for similar reasons.
This compiles on gcc 3.3.1
class Object
{
public:
template <int dim>
class Drawer
{
public:
class Basis
{
float e[dim][3];
};
};
};
typedef Object::Drawer<2>::Basis Vb2;
int main()
{
Vb2 x;
}
.



User: "Sharad Kala"

Title: Re: Meaning of template construction 09 Jul 2004 04:33:23 AM
"Xavier Décoret" <Xavier.Decoret@imag.fr> wrote in message
news:cclmpu$ghp$1@trompette.imag.fr...

I am trying to understand the meaning of this construction, found in the
CGAL library:

typedef typename Vb::template Rebind_TDS<TDS2>::Other Vb2;

Let me give it a try.
- Vb is a class template.
- Vb has a nested class template Rebind_TDS
- Rebind_TDS contains a type Other.
So the above statement means that Vb2 is a type alias for the Other type in
Rebind_TDS, which is instantiated with TDS2 in the Vb class template.
-Sharad
.


  Page 1 of 1

1

 


Related Articles
 

NEWER

pg.1232     pg.940     pg.716     pg.544     pg.412     pg.311     pg.234     pg.175     pg.130     pg.96     pg.70     pg.50     pg.35     pg.24     pg.16     pg.10     pg.6     pg.3     pg.1

OLDER