Template deduction issues with VC++ 2005
I posted this earlier in comp.lang.c++ but was told this could be a
VC++ 2005 compiler bug. Can anyone tell me if this is a known issue?
==========Original Post Follows===========================
I am sure this is going to turn out to be a dumb question but here goes
anyway.
I was trying out the Hello World equivalent of a template program that
determines whether the type passed is a class type. This example is
lifted straight out of C++ Templates by Josuttis et al. However I
can't get it to compile with VC++ 2005. Here is what I tried:
template<typename T>
class IsClassT
{
private:
typedef char One;
typedef struct { char a[2]; } Two;
template<typename C> static One test(int C::*);
template<typename C> static Two test(...);
public:
enum { Yes = sizeof(IsClassT<T>::test<T>(0)) == 1 };
enum { No = !Yes };
};
struct Idiot
{
};
int main()
{
if (IsClassT<Idiot>::Yes)
std::cout << "Hurray!\n";
return 0;
}
The compiler complains:
1>c:\work\workarea\allpurposeconsoleapp\allpurposeconsoleapp\allpurposeconsoleapp.cpp(510)
: error C2783: 'IsClassT<T>::Two IsClassT<T>::test(...)' : could not
deduce template argument for 'C'
1> with
1> [
1> T=Idiot
1> ]
1>
c:\work\workarea\allpurposeconsoleapp\allpurposeconsoleapp\allpurposeconsoleapp.cpp(508)
: see declaration of 'IsClassT<T>::test'
1> with
1> [
1> T=Idiot
1> ]
1>
c:\work\workarea\allpurposeconsoleapp\allpurposeconsoleapp\allpurposeconsoleapp.cpp(520)
: see reference to class template instantiation 'IsClassT<T>' being
compiled
1> with
1> [
1> T=Idiot
1> ]
1>c:\work\workarea\allpurposeconsoleapp\allpurposeconsoleapp\allpurposeconsoleapp.cpp(510)
: error C2784: 'IsClassT<T>::One IsClassT<T>::test(int C::* )' : could
not deduce template argument for 'int C::* ' from 'int'
1> with
1> [
1> T=Idiot
1> ]
1>
c:\work\workarea\allpurposeconsoleapp\allpurposeconsoleapp\allpurposeconsoleapp.cpp(507)
: see declaration of 'IsClassT<T>::test'
1> with
1> [
1> T=Idiot
1> ]
1>c:\work\workarea\allpurposeconsoleapp\allpurposeconsoleapp\allpurposeconsoleapp.cpp(510)
: error C2056: illegal expression
I thought promoting a zero integral constant to a pointer is preferred
over ellipsis?
thanks!