2010-07-27 5 views
1

У нас есть одноэлементный класс шаблона, как определяет нижестатической инициализации классов шаблонов для одноточечного объекта

template<class T> class Singleton{ 

    T& reference(){ 
     return objT; 
    } 

    private: 
    T objT; 

    }; 

And another user defined class which uses this singleton 

    class TestClass{ 

    static Singleton<TestClass> instance; 

    static TestClass * getPointer() 
    { 
     return &instance.objT; 
    } 


    private: 
    TestClass(){} 
    }; 

    template<TestClass> 
    Singleton<TestClass> TestClass::instance; 

На компиляции с GCC мы получаем ошибку

В функции static_initialization_and_destruction неопределенной ссылки на Singleton :: Singleton().

В чем причина этого.

ответ

1

Игнорируя тот факт, что в вашем примере нет необходимости шаблона 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; 

Чтобы объявить элемент типа Т, вам нужно полное определение этого типа Т. Итак, test1 и test2 не являются законными - есть только объявление, а не определение T. Напротив, test3 является законным - он находится после полного определения класса. Самый простой фикс здесь использовать указатель на тип - объявить указатель на тип T, вам нужна декларация вместо определения для типа T:

template <class T> 
struct Singleton 
{ 
    T * object; 
}; 
0
static Singleton<TestClass> instance; 

Вы на самом деле пытаетесь создать экземпляр класса Singleton в приведенной выше строке; который будет искать конструктор по умолчанию Singleton() (который уже присутствует, поскольку вы явно не определили его как private).

T& reference() - частный метод в вашем классе.

И я не очень понимаю, это

template<TestClass> 
    Singleton<TestClass> TestClass::instance; 

Вы уверены, что вы пытаетесь сделать? Причина я не;)

Может быть, вы хотите, чтобы прочитать это, чтобы понять, что вы делаете http://www.yolinux.com/TUTORIALS/C++Singleton.html

+0

Как экземпляр статические переменный, мне нужно, чтобы объявить его вне класса – Poorna

+0

Кажется, вы действительно не хотите использовать singleton здесь. – KedarX

0

простое исправление: Не использовать синглтон.

+0

Но этот код правильно компилируется с помощью VS Compiler – Poorna

+0

@siri: Поздравляем, у вас плохой шаблон проектирования для компиляции. – Puppy

Смежные вопросы