Почему неявная специализация шаблона не генерируется автоматически?

При создании динамически подключаемой библиотеки, содержащей статические переменные, доступные для всех процессов, подключающих ее образ, мне потребовалась следующая структура для работы с данными переменными:

template<typename T>
struct XO_DLL Property
{
protected:
    T volatile m_value;
public:
    Property(T value);
    void SetValue(T value);
    T GetValue();
    __declspec(property(get = GetValue, put = SetValue)) T Value;
};

Здесь же в библиотеке объявляются оные переменные:

#pragma section(".xo", read, write, shared)
#define SHARED __declspec(allocate(".xo"))

SHARED Property<int> g_turns = Property<int>(127);

Библиотека компилируется, но при компилировании основного приложения выдается следующее:

Main.obj : error LNK2019: ссылка на неразрешенный внешний символ "__declspec(dllimport) public: int __thiscall Property<int>::GetValue(void)" (__imp_?GetValue@?$Property@H@@QAEHXZ) в функции _main.
Main.exe : fatal error LNK1120: неразрешенных внешних элементов: 1

Говоря иначе, «в библиотеке отсутствует специализация метода GetValue для T = int». Ошибка исчезает, если явно объявить данную специализацию (в дополнение к общей):

template<typename T>
T Property<T>::GetValue()
{
    return m_value;
}

int Property<int>::GetValue()
{
    return m_value;
}

Про идентичный проблемному SetValue промолчу: работает и хорошо.

Почему компилятор после объявления переменной типа Property<int> не генерирует данную специализацию Property<int>::GetValue самостоятельно на основе общей специализации Property<T>::GetValue?


Демонстрационный проект


Ответы (0 шт):