Template type deduction issues

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Dilip

    #1

    Template type deduction issues

    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<typena me T>
    class IsClassT
    {
    private:
    typedef char One;
    typedef struct { char a[2]; } Two;
    template<typena me Cstatic One test(int C::*);
    template<typena me Cstatic 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\worka rea\allpurposec onsoleapp\allpu rposeconsoleapp \allpurposecons oleapp.cpp(510)
    : error C2783: 'IsClassT<T>::T wo IsClassT<T>::te st(...)' : could not
    deduce template argument for 'C'
    1 with
    1 [
    1 T=Idiot
    1 ]
    1>
    c:\work\workare a\allpurposecon soleapp\allpurp oseconsoleapp\a llpurposeconsol eapp.cpp(508)
    : see declaration of 'IsClassT<T>::t est'
    1 with
    1 [
    1 T=Idiot
    1 ]
    1>
    c:\work\workare a\allpurposecon soleapp\allpurp oseconsoleapp\a llpurposeconsol eapp.cpp(520)
    : see reference to class template instantiation 'IsClassT<T>' being
    compiled
    1 with
    1 [
    1 T=Idiot
    1 ]
    1>c:\work\worka rea\allpurposec onsoleapp\allpu rposeconsoleapp \allpurposecons oleapp.cpp(510)
    : error C2784: 'IsClassT<T>::O ne IsClassT<T>::te st(int C::* )' : could
    not deduce template argument for 'int C::* ' from 'int'
    1 with
    1 [
    1 T=Idiot
    1 ]
    1>
    c:\work\workare a\allpurposecon soleapp\allpurp oseconsoleapp\a llpurposeconsol eapp.cpp(507)
    : see declaration of 'IsClassT<T>::t est'
    1 with
    1 [
    1 T=Idiot
    1 ]
    1>c:\work\worka rea\allpurposec onsoleapp\allpu rposeconsoleapp \allpurposecons oleapp.cpp(510)
    : error C2056: illegal expression

    I thought promoting a zero integral constant to a pointer is preferred
    over ellipsis?

    thanks!

  • Victor Bazarov

    #2
    Re: Template type deduction issues

    Dilip wrote:
    I am sure this is going to turn out to be a dumb question but here
    goes anyway.
    >
    [...example of VC++ 2005 failing snipped...]
    >
    I thought promoting a zero integral constant to a pointer is preferred
    over ellipsis?
    It is most likely a bug in VC++. Have you tried asking in the VC++ NG
    (microsoft.publ ic.vc.language) , maybe it's already known?

    V
    --
    Please remove capital 'A's when replying by e-mail
    I do not respond to top-posted replies, please don't ask


    Comment

    • amparikh@gmail.com

      #3
      Re: Template type deduction issues


      Dilip wrote:
      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<typena me T>
      class IsClassT
      {
      private:
      typedef char One;
      typedef struct { char a[2]; } Two;
      template<typena me Cstatic One test(int C::*);
      template<typena me Cstatic 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\worka rea\allpurposec onsoleapp\allpu rposeconsoleapp \allpurposecons oleapp.cpp(510)
      : error C2783: 'IsClassT<T>::T wo IsClassT<T>::te st(...)' : could not
      deduce template argument for 'C'
      1 with
      1 [
      1 T=Idiot
      1 ]
      1>
      c:\work\workare a\allpurposecon soleapp\allpurp oseconsoleapp\a llpurposeconsol eapp.cpp(508)
      : see declaration of 'IsClassT<T>::t est'
      1 with
      1 [
      1 T=Idiot
      1 ]
      1>
      c:\work\workare a\allpurposecon soleapp\allpurp oseconsoleapp\a llpurposeconsol eapp.cpp(520)
      : see reference to class template instantiation 'IsClassT<T>' being
      compiled
      1 with
      1 [
      1 T=Idiot
      1 ]
      1>c:\work\worka rea\allpurposec onsoleapp\allpu rposeconsoleapp \allpurposecons oleapp.cpp(510)
      : error C2784: 'IsClassT<T>::O ne IsClassT<T>::te st(int C::* )' : could
      not deduce template argument for 'int C::* ' from 'int'
      1 with
      1 [
      1 T=Idiot
      1 ]
      1>
      c:\work\workare a\allpurposecon soleapp\allpurp oseconsoleapp\a llpurposeconsol eapp.cpp(507)
      : see declaration of 'IsClassT<T>::t est'
      1 with
      1 [
      1 T=Idiot
      1 ]
      1>c:\work\worka rea\allpurposec onsoleapp\allpu rposeconsoleapp \allpurposecons oleapp.cpp(510)
      : error C2056: illegal expression
      >
      I thought promoting a zero integral constant to a pointer is preferred
      over ellipsis?
      >
      thanks!
      I encountered a similar problem few weeks back. I was about to enter a
      bug when I saw a bug already entered on similar lines.



      Comment

      • amparikh@gmail.com

        #4
        Re: Template type deduction issues


        Dilip wrote:
        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<typena me T>
        class IsClassT
        {
        private:
        typedef char One;
        typedef struct { char a[2]; } Two;
        template<typena me Cstatic One test(int C::*);
        template<typena me Cstatic 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\worka rea\allpurposec onsoleapp\allpu rposeconsoleapp \allpurposecons oleapp.cpp(510)
        : error C2783: 'IsClassT<T>::T wo IsClassT<T>::te st(...)' : could not
        deduce template argument for 'C'
        1 with
        1 [
        1 T=Idiot
        1 ]
        1>
        c:\work\workare a\allpurposecon soleapp\allpurp oseconsoleapp\a llpurposeconsol eapp.cpp(508)
        : see declaration of 'IsClassT<T>::t est'
        1 with
        1 [
        1 T=Idiot
        1 ]
        1>
        c:\work\workare a\allpurposecon soleapp\allpurp oseconsoleapp\a llpurposeconsol eapp.cpp(520)
        : see reference to class template instantiation 'IsClassT<T>' being
        compiled
        1 with
        1 [
        1 T=Idiot
        1 ]
        1>c:\work\worka rea\allpurposec onsoleapp\allpu rposeconsoleapp \allpurposecons oleapp.cpp(510)
        : error C2784: 'IsClassT<T>::O ne IsClassT<T>::te st(int C::* )' : could
        not deduce template argument for 'int C::* ' from 'int'
        1 with
        1 [
        1 T=Idiot
        1 ]
        1>
        c:\work\workare a\allpurposecon soleapp\allpurp oseconsoleapp\a llpurposeconsol eapp.cpp(507)
        : see declaration of 'IsClassT<T>::t est'
        1 with
        1 [
        1 T=Idiot
        1 ]
        1>c:\work\worka rea\allpurposec onsoleapp\allpu rposeconsoleapp \allpurposecons oleapp.cpp(510)
        : error C2056: illegal expression
        >
        I thought promoting a zero integral constant to a pointer is preferred
        over ellipsis?
        >
        thanks!
        Of course, I got around the problem by making the member template test
        to a non-template member function.

        Comment

        Working...