статическая инициализация классов Template для одноэлементного объекта - PullRequest
1 голос
/ 27 июля 2010

У нас есть шаблон шаблона синглтона, как определено ниже

  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 ().

В чем может быть причина.

Ответы [ 3 ]

1 голос
/ 27 июля 2010

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

Самое простое решение: не используйте синглтон.

0 голосов
/ 27 июля 2010
static Singleton<TestClass> instance;

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

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

И ядействительно не поняла

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...