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?