template<> keyword - unexpected hides base typedefs

G

Grizlyk

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

*/
 
O

Ondra Holub

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()
{
}
 
O

Ondra Holub

Grizlyk napsal:
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();
};
 
G

Grizlyk

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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top