I am thinking: why if i will comment lines marked with '#' in the following
example, all will be compiled, else will not:
// ***********************
typedef unsigned uint;
namespace Pxx{
template <
class Tobj,
class c_Second,
class Tuint=uint
>class First
{
public:
typedef c_Second Second;
typedef typename c_Second::Third Third; //#1
typedef typename c_Second::Forth Forth; //#2
First(){}
inline explicit First(const Tuint);
public:
class Tfriend
{
public:
public:
mutable First *parent;
void
operator= (const First *const p)const
{ parent=const_cast<First*>(p); }
Tfriend():parent(0){}
Tfriend(const First& p):
parent(const_cast<First*>(&p))
{}
};
};}
// ***********************
namespace Pxx{
template <
class Tobj,
class c_First,
class c_Forth,
class c_Third,
class Tuint=uint
>class Second
{
public:
typedef c_First First;
typedef c_Forth Forth;
typedef c_Third Third;
//derived Second
typedef typename c_First::Second c_Second;
Second(){}
inline Second(const First&);
};}
// ***********************
// ***********************
namespace Pxx{
namespace Puser{
// ***********************
template <class Tobj,class Tuintclass First;
template <class Tobj,class Tuintclass Second;
template <class Tobj,class Tuintclass Third;
template <class Tobj,class Tuintclass Forth;
// ***********************
template <
class Tobj,
class Tuint=uint
>class First:
public Pxx::First<
Tobj,
Second<Tobj,Tuint>,
Tuint
>{
typedef Pxx::First<
Tobj,
Second<Tobj,Tuint>,
Tuint
>Tparent;
public:
typedef typename Tparent::Second Second;
First(){}
explicit First(const Tuint p):Tparent(p){}
};
// ***********************
template <
class Tobj,
class Tuint=uint
>class Second:
public Pxx::Second<
Tobj,
First<Tobj,Tuint>,
Forth<Tobj,Tuint>,
Third<Tobj,Tuint>,
Tuint
>{
typedef Pxx::Second<
Tobj,
First<Tobj,Tuint>,
Forth<Tobj,Tuint>,
Third<Tobj,Tuint>,
Tuint
>Tparent;
public:
typedef typename Tparent::First First;
Second(){}
Second(const First& p):Tparent(p){}
};
//namespace Puser
}
//namespace Pxx
}
using Pxx::Puser::First;
using Pxx::Puser::Second;
// ***********************
// ***********************
First<intfirst(100);
Second<intsecond(first);
=============
Output
11.cpp: In instantiation of
'Pxx::Second<int,
Pxx::Puser::First<int, unsigned int>,
Pxx::Puser::Forth<int, unsigned int>,
Pxx::Puser::Third<int, unsigned int>,
unsigned int>':
11.cpp:113: instantiated from
'Pxx::Puser::Second<int, unsigned int>'
11.cpp:14: instantiated from
'Pxx::First<int,
Pxx::Puser::Second<int, unsigned int>,
unsigned int>'
11.cpp:86: instantiated from
'Pxx::Puser::First<int, unsigned int>'
11.cpp:141: instantiated from here
11.cpp:57: error: no type named 'Second' in 'class
11.cpp:57: error: Pxx::Puser::First<int, unsigned int>'
--
Maksim A. Polyanin
http://grizlyk1.narod.ru/cpp_new
"In thi world of fairy tales rolls are liked olso"
/Gnume/