#include <iostream>
#include <list>

template <class T1, class T2>
class FirstClass
{
public:
 FirstClass (T1 & a, T2 & b);
};

template <class T1, class T2, class T3>
class SecondClass
{
public:
 SecondClass (T1 & a, T2 & b, T3 & c);
};

template<class T1, class T2, class T3 = FirstClass<T1, T2>>
class FirstPool
{
	std::list <T3> Objects;
	T1 aa;
	T2 bb;

public:
	FirstPool (T1 & a, T2 & b) : aa (a), bb (b) {}
};

template<class T1, class T2, class T3>
class SecondPool : FirstPool<T1, T2, SecondClass<T1, T2, T3>>
{

	T3 cc;

public:
	SecondPool (T1 & a, T2 & b, T3 & c)
	: FirstPool<T1, T2, SecondClass<T1, T2, T3>>(a, b)
	, cc (c)
	{}
};


int main() {
	// your code goes here

	return 0;
}