Почему неявная специализация шаблона не генерируется автоматически?
При создании динамически подключаемой библиотеки, содержащей статические переменные, доступные для всех процессов, подключающих ее образ, мне потребовалась следующая структура для работы с данными переменными:
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?