Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   template<> keyword - unexpected hides base typedefs (http://www.velocityreviews.com/forums/t459830-template-keyword-unexpected-hides-base-typedefs.html)

Grizlyk 01-15-2007 07:46 AM

template<> keyword - unexpected hides base typedefs
 
Hello.

Why were base class "typedefs" hidden by template<> and explicit usage
of them does not work too?

Try open only one of the lines in the example below
//using Tparent::Tptr;
//typedef Tparent::Tptr Tptr;

Consider example:

template< class A, class B> class Z;
template< class A, class B> class Ext1;


template< class A, class B>
class Base
{
public:
typedef Z<A,B> Tptr;
};


template< class A >
class Derived: public Base<A, Ext1<int,int> >
{
public:
typedef Base<A, Ext1<int,int> > Tparent;

using Tparent::Tptr;
typedef Tparent::Tptr Tptr;

inline void test(const Tptr obj)throw();
};


class Base2
{
public:
typedef Z<int,int> Tptr;
};


class Derived2: public Base2
{
public:
typedef Base2 Tparent;

using Tparent::Tptr;
//typedef Tparent::Tptr Tptr;

inline void test(const Tptr obj)throw();
};


/*

5.cpp:18: error: ISO C++ forbids declaration of 'Tptr' with no type
5.cpp:18: error: cannot declare member 'Base<A, Ext1<int, int> >::Tptr'

within 'Derived<A>'
5.cpp:18: error: expected ';' before 'Tptr'
5.cpp:20: error: expected ',' or '...' before 'obj'
5.cpp:20: error: ISO C++ forbids declaration of 'Tptr' with no type

*/


Ondra Holub 01-15-2007 07:54 AM

Re: template<> keyword - unexpected hides base typedefs
 

Grizlyk napsal:
> Hello.
>
> Why were base class "typedefs" hidden by template<> and explicit usage
> of them does not work too?
>
> Try open only one of the lines in the example below
> //using Tparent::Tptr;
> //typedef Tparent::Tptr Tptr;
>
> Consider example:
>
> template< class A, class B> class Z;
> template< class A, class B> class Ext1;
>
>
> template< class A, class B>
> class Base
> {
> public:
> typedef Z<A,B> Tptr;
> };
>
>
> template< class A >
> class Derived: public Base<A, Ext1<int,int> >
> {
> public:
> typedef Base<A, Ext1<int,int> > Tparent;
>
> using Tparent::Tptr;
> typedef Tparent::Tptr Tptr;
>
> inline void test(const Tptr obj)throw();
> };
>
>
> class Base2
> {
> public:
> typedef Z<int,int> Tptr;
> };
>
>
> class Derived2: public Base2
> {
> public:
> typedef Base2 Tparent;
>
> using Tparent::Tptr;
> //typedef Tparent::Tptr Tptr;
>
> inline void test(const Tptr obj)throw();
> };
>
>
> /*
>
> 5.cpp:18: error: ISO C++ forbids declaration of 'Tptr' with no type
> 5.cpp:18: error: cannot declare member 'Base<A, Ext1<int, int> >::Tptr'
>
> within 'Derived<A>'
> 5.cpp:18: error: expected ';' before 'Tptr'
> 5.cpp:20: error: expected ',' or '...' before 'obj'
> 5.cpp:20: error: ISO C++ forbids declaration of 'Tptr' with no type
>
> */


There is missing keyword typedef:

template< class A, class B> class Z;
template< class A, class B> class Ext1;

template< class A, class B>
class Base
{
public:
typedef Z<A,B> Tptr;

};

template< class A >
class Derived: public Base<A, Ext1<int,int> >
{
public:
typedef Base<A, Ext1<int,int> > Tparent;

using Tparent::Tptr;
typedef typename Tparent::Tptr Tptr2;

inline void test(const Tptr2 obj)throw();

};

class Base2
{
public:
typedef Z<int,int> Tptr;

};

class Derived2: public Base2
{
public:
typedef Base2 Tparent;

using Tparent::Tptr;
//typedef Tparent::Tptr Tptr;

inline void test(const Tptr obj)throw();

};

int main()
{
}


Grizlyk 01-15-2007 01:59 PM

Re: template<> keyword - unexpected hides base typedefs
 

Ondra Holub wrote:

> There is missing keyword typedef:


Where exactly?

I want to say, that compiler can not compile even well defined (known)
type from base class.


Ondra Holub 01-15-2007 02:06 PM

Re: template<> keyword - unexpected hides base typedefs
 

Grizlyk napsal:
> Ondra Holub wrote:
>
> > There is missing keyword typedef:

>
> Where exactly?
>
> I want to say, that compiler can not compile even well defined (known)
> type from base class.


Oh, sorry. I made typo - there is missing typename (not typedef) in
typedef typename Tparent::Tptr Tptr2

Here is a touched part of code:

template< class A >
class Derived: public Base<A, Ext1<int,int> >
{
public:
typedef Base<A, Ext1<int,int> > Tparent;

using Tparent::Tptr;
typedef typename Tparent::Tptr Tptr2;

inline void test(const Tptr2 obj)throw();
};


Grizlyk 01-15-2007 02:26 PM

Re: template<> keyword - unexpected hides base typedefs
 

Ondra Holub write:

> Oh, sorry. I made typo - there is missing typename (not typedef) in
> typedef typename Tparent::Tptr Tptr2
>
> Here is a touched part of code:
>
> template< class A >
> class Derived: public Base<A, Ext1<int,int> >
> {
> public:
> typedef Base<A, Ext1<int,int> > Tparent;
>
> using Tparent::Tptr;
> typedef typename Tparent::Tptr Tptr2;
>
> inline void test(const Tptr2 obj)throw();
> };


Yes, it is work. Thanks.
But it is very not clear to me, why I can declare with "using" method
of base class, but can not do type.



All times are GMT. The time now is 04:02 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.