I have some code.
#include <iostream>
template<typename T>
struct Test
{
Test(bool v):flg(v) { }
void func() { }
typedef void (Test::*unspecified)();
operator unspecified() const
{
return flg ? &Test::func : 0;
}
bool flg;
};
template<typename T>
std::ostream& operator << (std::ostream&, typename Test<T>::unspecified);
int main()
{
Test<int> t(true);
std::cout << t << std::endl;
}
Output is
1
It works fine, but i want to get undefined reference. If Test is not template class i get undefined reference. So, why compiler not use operator << for function type and do standart conversion from pointer to class-member to bool?
In
typename Test<T>::unspecified,Tis in a non-deducible context, since it appears to the left of a::. Thus your function template is never even considered, and the conversion tounspecifiedis used as the sole viable overload.The short answer is simply that “templates don’t work like that”. Let me know if you want a longer answer.