Игнорируя тот факт, что в вашем примере нет необходимости в шаблоне Singleton, рассмотрим этот упрощенный пример (я использую структуры, чтобы избежать проблем с доступом):
template <class T>
struct Singleton
{
T object;
};
struct TestClass;
typedef Singleton<TestClass> TCS;
TCS test1; // not ok, no definition of TestClass available;
struct TestClass
{
TestClass(){}
static TCS test2; // not ok, no definition of TestClass available;
};
TCS test3; // ok, TestClass is defined;
Чтобы объявить член типа T, вам нужно полное определение этого типа T. Таким образом, test1 и test2 не являются допустимыми - есть только объявление, а не определение T. Напротив, test3 допустим - это находится после полного определения класса. Здесь проще всего использовать указатель на тип - чтобы объявить указатель на тип T, вам нужно объявление вместо определения для типа T:
template <class T>
struct Singleton
{
T * object;
};