Чтобы получить ошибку во время компиляции, используйте ее как:
template<typename T>
T GetGlobal(const char *name) { T::unimplemented_function; }
// `unimplemented_function` identifier should be undefined
Если вы используете Boost, вы можете сделать его более элегантным:
template<typename T>
T GetGlobal(const char *name) { BOOST_STATIC_ASSERT(sizeof(T) == 0); }
C ++ Standard гарантирует, что не существует такого типа, размер которого равен 0, поэтому вы получите ошибку во время компиляции.
Как sbi предположил в своих комментариях, последнее может быть уменьшено до:
template<typename T>
T GetGlobal(const char *name) { char X[!sizeof(T)]; }
Я предпочитаю первое решение, потому что оно дает более четкое сообщение об ошибке (по крайней мере, в Visual C ++), чем другие.