Пусть мы имеем шаблон класса:
// file MyClass.h template <typename T> class MyClass { private: MyClass(); public: static MyClass<T>& getInstance(); void foo(); }; template <typename T> MyClass<T>& getInstance() { static MyClass<T> inst; return inst; } template <typename T> MyClass<T>::MyClass() { //... } template <typename T> void MyClass<T>::foo() { //... }
Здесь мы хотим использовать синглтон Мейерса, который реализует функция getInstance:
template <typename T> MyClass<T>& getInstance() { static MyClass<T> inst; return inst; }
То есть, мы можем создать ссылки на экземпляр MyClass:
MyClass<int>& a = MyClass<int>::getInstance();
, причём фактически экземпляр класса будет создан один для каждого различного параметра шаблона. То есть для MyClass
Внимание, вопросы знатокам: будет ли компилироваться такой код? будет ли он работать?
Ответ: да, компилироваться будет. Нет, работать не будет.
Потому что он не будет линковаться. То есть объектник мы получим, а линкер нам выдаст: "undefined reference to `MyClass
Вот так.
А если мы сделаем так:
// file MyClass.h template <typename T> class MyClass { private: MyClass(); public: static MyClass<T>& getInstance() { static MyClass<T> inst; return inst; } void foo(); }; template <typename T> MyClass<T>::MyClass() { //... } template <typename T> void MyClass<T>::foo() { //... }
то всё компилируется, собирается и работает. Почувствуйте разницу.