Привет всем!
Столкнулся со странным поведением 8 и 9-ой студии при неявном инстанцировании шаблонных классов при использовании указателей на их статические члены во время компиляции. Как известно, параметрами шаблонов могут являться указатели на объекты с внешним связыванием. И вот, если определить шаблонную функцию, принимающую такой указатель, а потом параметризовать ее указателем на статическую переменную шаблонного класса, то возникает ошибка линковки "unresolved external symbol", говорящая о том, что статический член шаблонного класса не был инстанцирован. Если же шаблонную функцию заменить шаблонным классом, то ошибка уходит. На VC-7.1 данная проблема не проявляется. Вот минимальный код, воспроизводящий проблему:
#include <iostream>
template<const int* value>
struct Test {
static void test() { std::cout << *value << std::endl; }
};
template<const int* value>
void test() { std::cout << *value << std::endl; }
template<typename T>
struct Host {
static T instance;
};
template<typename T> T Host<T>::instance;
int main()
{
test<&Host<int>::instance>(); //error LNK2001: unresolved external symbol "public: static int Host<int>::instance"
//Test<&Host<int>::instance>::test();
}
Если раскомментировать последнюю строку в функции
main, то инстанцирование выполняется и ошибка исчезает.
Посмотрел, что говорит стандарт по вопросам неявного инстанцирования, ничего близкого к теме не нашел. Может кто-нибудь дать объяснение этому "спецэффекту"?