Boost logo

Boost :

Subject: Re: [boost] Complier bug taking the address of an instantiated member function template ?
From: Doug Gregor (doug.gregor_at_[hidden])
Date: 2011-03-15 16:10:21


On Tue, Mar 15, 2011 at 1:01 PM, Edward Diener <eldiener_at_[hidden]> 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


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk