Да, вот еще более простой (или вызывающий) пример 
C++ (Qt)
#include <QSet>
#include <QString>
 
uint qHash( const std::string & str )
{
	return qHash(QString::fromStdString(str));
}
 
int main( void )
{
	QSet<std::string> set;
	set.insert(std::string("abc"));
 
	return 0;
}
 
Не компилится. Придется выносить qHash в хедер и включать "до того". Оказывается надо было делать спецификацией
C++ (Qt)
template<>
uint qHash<std::string>( const std::string & str )
{
	return qHash(QString::fromStdString(str));
}
 
Но что тогда писать до спецификации
template<class T>
uint qHash( const T & t )
{
   ???
}
Чтобы компилятор вякал если нужного qHash нету
Спасибо