Re[3]: Инстанцирование шаблонных функций. Ошибка при линковк
От: Аноним  
Дата: 29.09.03 13:11
Оценка:
L_L>Так если это VC, то тогда да, он такое не любит fun(z<int>) — объявляй тогда указатель на функцию, либо явно инстанцируй

Да, это MSVC 6
так тоже не линкуется

template <typename T>
void z(const T t)
{}

template <typename T>
void f(const T t)
{}

//Instantiate z with the explicitly specified template
//argument ‘int’
template void z<int> (int);

int main(int argc, char* argv[])
{
f(z<int>);
return 0;
}

TSpec.obj : error LNK2001: unresolved external symbol "void __cdecl z(int)" (?z@@YAXH@Z)
Debug/TSpec.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

TSpec.exe — 2 error(s), 0 warning(s)

пробовал
(void)(z<int>);
(void*)(z<int>);
(void*)(&z<int>);
void(*pz)(const int) = &(z<int>);
всё равно не помогает, некоторые даже не компилируются.
спасает только
if(0) z<int>(1);
и
int void(*pz)(int)
pz = z<int>;

Откуда растут ноги:
в некоторые места(шаблоны) нужно передавать функторы —
можно передать либо класс, в котором есть operator() или функцию (её адрес).
Всё было нормально до тех пор, пока я не попытался передать туда инстанциированную шаблонную функцию.
Может это потому, что шаблонная функция не может быть параметром шаблона (могу наврать, но что-то подобное есть в стандарте).
Но я ведь передаю туда её конкретный "инстанс".
Это следствие стандарта или просто глюк VC6?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.