
On Tue, Mar 15, 2011 at 1:01 PM, Edward Diener <eldiener@tropicsoft.com> wrote:
Apologies as this is off-topic, as it refers to C++ and not Boost, but I have run into this working with my TTI library in the sandbox and hopefully some Boost developer has run into this and can tell me whether all compilers are broken or I am doing something completely wrong in my use of C++ syntax:
The code:
"struct AType { double SomeFunc(int,long *,double &) { double ret(0); return ret; } template<class X,class Y,class Z,short AA> double SomeFuncTemplate(X,Y *,Z &) { double ret(AA); return ret; } };
template < class T > struct TTest { typedef char Bad; struct Good { char x[2]; }; template<T> struct helper; static Good check(helper<&AType::template SomeFuncTemplate<int,long,double,50> > *); static Bad check(...); static const bool value=sizeof(check(0))==sizeof(Good); };
template < class T, class C > struct TTest1 { typedef char Bad; struct Good { char x[2]; }; template<T> struct helper; template<class U> static Good check(helper<&U::SomeFunc> *); template<class U> static Bad check(...); static const bool value=sizeof(check<C>(0))==sizeof(Good); };
template < class T, class C > struct TTest2 { typedef char Bad; struct Good { char x[2]; }; template<T> struct helper; template<class U> static Good check(helper<&U::template SomeFuncTemplate<int,long,double,50> > *); template<class U> static Bad check(...); static const bool value=sizeof(check<C>(0))==sizeof(Good); };
int main() {
static_assert(TTest < double (AType::*)(int,long *,double &) >::value, "failure in TTest" );
static_assert(TTest1 < double (AType::*)(int,long *,double &), AType >::value, "failure in TTest1" );
static_assert(TTest2 < double (AType::*)(int,long *,double &), AType >::value, "failure in TTest2" );
return 0;
}"
Both gcc 4.5.2 ( with -std=c++0x ) and msvc 10.0 put out the static assert "failure in TTest2". I do not see why this is happening. I have no tried clang, but if I could figure out how to use it in Windows I would.
Anyone ?
The code looks well-formed to me; Clang accepts it. - Doug