Hi, guys
I am reading Vandevoorde and Josuttis 's "C++ Template The Complete
Guide" these days.
When I read the chapter 15: Traits and Policy classes.
I copy the code in 15.2.2 that use to determining the class type.
The code is below:
#include <iostream>
template<typename T>
class IsClassT {
private:
typedef char One;
typedef struct { char a[2]; } Two;
template<typename Cstatic One test(int C::*);
template<typename Cstatic Two test(...);
public:
enum { Yes = sizeof(IsClassT<T>::test<T>(0)) == 1 };
enum { No = !Yes };
};
struct MyStruct{};
union MyUnion{};
int main()
{
std::cout << IsClassT<MyStruct>::Yes << std::endl
<< IsClassT<MyUnion>::Yes << std::endl;
return 0;
}
It can be compiled using the Comeau C/C++ 4.3.8 for ONLINE_EVALUATION
but it can't be compiled using the MS VC 8 and gcc version 3.4.2
(mingw-special)
the error message is:
1>d:\code\vc8_debug\sample\main.cpp(56) : error C2783:
'IsClassT<T>::Two IsClassT<T>::test(...)' : could not deduce template
argument for 'C'
1 with
1 [
1 T=MyStruct
1 ]
1 d:\code\vc8_debug\sample\main.cpp(54) : see declaration of
'IsClassT<T>::test'
1 with
1 [
1 T=MyStruct
1 ]
1 d:\code\vc8_debug\sample\main.cpp(65) : see reference to
class template instantiation 'IsClassT<T>' being compiled
1 with
1 [
1 T=MyStruct
1 ]
1>d:\code\vc8_debug\sample\main.cpp(56) : 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=MyStruct
1 ]
1 d:\code\vc8_debug\sample\main.cpp(53) : see declaration of
'IsClassT<T>::test'
1 with
1 [
1 T=MyStruct
1 ]
1>d:\code\vc8_debug\sample\main.cpp(56) : error C2056: illegal
expression
1>d:\code\vc8_debug\sample\main.cpp(56) : error C2783:
'IsClassT<T>::Two IsClassT<T>::test(...)' : could not deduce template
argument for 'C'
1 with
1 [
1 T=MyUnion
1 ]
1 d:\code\vc8_debug\sample\main.cpp(54) : see declaration of
'IsClassT<T>::test'
1 with
1 [
1 T=MyUnion
1 ]
1 d:\code\vc8_debug\sample\main.cpp(66) : see reference to
class template instantiation 'IsClassT<T>' being compiled
1 with
1 [
1 T=MyUnion
1 ]
1>d:\code\vc8_debug\sample\main.cpp(56) : 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=MyUnion
1 ]
1 d:\code\vc8_debug\sample\main.cpp(53) : see declaration of
'IsClassT<T>::test'
1 with
1 [
1 T=MyUnion
1 ]
1>d:\code\vc8_debug\sample\main.cpp(56) : error C2056: illegal
expression
1>Build log was saved at "file://d:\code\vc8_debug\sample\Debug
\BuildLog.htm"
1>sample - 6 error(s), 0 warning(s)
Why it can't be compiled using vc8 and gcc??