Compiler Error C2918

'name' : illegal use of local type in type instantiation

You cannot instantiate a function based on a function template based on a local type. Types used to instantiate must have external linkage.

The following sample generates C2918:

// C2918.cpp
// compile with: /Za /c
template<class T> 
void f(T t) {};

template<class T> 
void g(T t) {};
struct Y {};

void g() {
   struct X {};

   X x;
   f(x);   // C2918

   Y y;
   g(y);
}