![]() |
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 */ |
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() { } |
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. |
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(); }; |
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 02:21 AM. |
Powered by vBulletin®. Copyright ©2000 - 2013, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.