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)).
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
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
> 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;
}