[vc 8,9][bug?] "Спецэффект" при неявном инстанцировании
От: rg45 СССР  
Дата: 25.12.09 12:16
Оценка: 31 (1)
Привет всем!

Столкнулся со странным поведением 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, то инстанцирование выполняется и ошибка исчезает.

Посмотрел, что говорит стандарт по вопросам неявного инстанцирования, ничего близкого к теме не нашел. Может кто-нибудь дать объяснение этому "спецэффекту"?
--
Справедливость выше закона. А человечность выше справедливости.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.