Templates and inheritance

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

    #1

    Templates and inheritance

    Hi,

    I have the following problem. Consider two simple classes AA and BB,
    BB inherits from AA. AA contains a class A inside and a pure virtual
    method getA returning an object of class A. BB overrides both.
    Here is the code:

    class AA {
    public:
    class A {
    public:
    A(void) {};
    };
    virtual A getA(void) = 0;
    virtual ~AA() {};
    };

    class BB : public AA {
    public:
    class A : public AA::A {
    public:
    A(void) {};
    };
    virtual AA::A getA(void) { return BB::A(); };
    virtual ~BB() {};
    };

    BB b;

    int main(void)
    {
    return 0;
    }

    So far, so good. Everything goes fine. But now suppose that we
    change the classes AA/BB into class *templates*:

    template <class T>
    class AA {
    public:
    class A {
    public:
    A(void) {};
    };
    virtual A getA(void) = 0;
    virtual ~AA() {};
    };

    template <class T, unsigned N>
    class BB : public AA<T{
    public:
    class A : public AA<T>::A {
    public:
    A(void) {};
    };
    virtual AA<T>::A getA(void) { return BB::A(); };
    virtual ~BB() {};
    };

    BB<int,5b;

    int main()
    {
    return 0;
    }

    Although I didn't do any other changes, I cannot compile it
    (with GNU C++ 4.1.0). I receive the following errors:

    wzlsd2.cpp:19: error: type 'AA<T>' is not derived from type 'BB<T, N>'
    wzlsd2.cpp:19: error: expected ';' before 'getA'
    wzlsd2.cpp:23: error: cannot declare variable 'b' to be of abstract type
    'BB<int, 5u>'
    wzlsd2.cpp:13: note: because the following virtual functions are pure within
    'BB<int, 5u>':
    wzlsd2.cpp:8: note: AA<T>::A AA<T>::getA() [with T = int]

    Obviously the first error is the important one. Compiler does not accept
    the type AA<T>::A, althougth it accepted it just few lines above (when
    declaring class BB<T,N>::A).

    And my question is: what's wrong? What mistake I'm doing here?
    Or is this a compiler's bug?

    TIA,
    Przemek




  • red floyd

    #2
    Re: Templates and inheritance

    Przemyslaw Koprowski wrote:
    Hi,
    >
    I have the following problem. Consider two simple classes AA and BB,
    BB inherits from AA. AA contains a class A inside and a pure virtual
    method getA returning an object of class A. BB overrides both.
    Here is the code:
    >
    class AA {
    public:
    class A {
    public:
    A(void) {};
    };
    virtual A getA(void) = 0;
    virtual ~AA() {};
    };
    >
    class BB : public AA {
    public:
    class A : public AA::A {
    public:
    A(void) {};
    };
    virtual AA::A getA(void) { return BB::A(); };
    virtual ~BB() {};
    };
    >
    BB b;
    >
    int main(void)
    {
    return 0;
    }
    >
    So far, so good. Everything goes fine. But now suppose that we
    change the classes AA/BB into class *templates*:
    >
    template <class T>
    class AA {
    public:
    class A {
    public:
    A(void) {};
    };
    virtual A getA(void) = 0;
    virtual ~AA() {};
    };
    >
    template <class T, unsigned N>
    class BB : public AA<T{
    public:
    class A : public AA<T>::A {
    public:
    A(void) {};
    };
    virtual AA<T>::A getA(void) { return BB::A(); };
    virtual ~BB() {};
    };
    >
    BB<int,5b;
    >
    int main()
    {
    return 0;
    }
    >
    Although I didn't do any other changes, I cannot compile it
    (with GNU C++ 4.1.0). I receive the following errors:
    >
    wzlsd2.cpp:19: error: type 'AA<T>' is not derived from type 'BB<T, N>'
    wzlsd2.cpp:19: error: expected ';' before 'getA'
    wzlsd2.cpp:23: error: cannot declare variable 'b' to be of abstract type
    'BB<int, 5u>'
    wzlsd2.cpp:13: note: because the following virtual functions are pure within
    'BB<int, 5u>':
    wzlsd2.cpp:8: note: AA<T>::A AA<T>::getA() [with T = int]
    >
    Obviously the first error is the important one. Compiler does not accept
    the type AA<T>::A, althougth it accepted it just few lines above (when
    declaring class BB<T,N>::A).
    >
    virtual typename AA<T>::A getA().

    And remove the BB:: inside getA

    virtual typename AA<T>::A getA() { return A(); }


    Comment

    • Michael

      #3
      Re: Templates and inheritance

      On Mar 30, 12:49 pm, Przemyslaw Koprowski <o...@siggraph. pkoprowski>
      wrote:
      So far, so good. Everything goes fine. But now suppose that we
      change the classes AA/BB into class *templates*:
      >
      template <class T>
      class AA {
      public:
      class A {
      public:
      A(void) {};
      };
      virtual A getA(void) = 0;
      virtual ~AA() {};
      >
      };
      >
      template <class T, unsigned N>
      class BB : public AA<T{
      public:
      class A : public AA<T>::A {
      public:
      A(void) {};
      };
      virtual AA<T>::A getA(void) { return BB::A(); };
      virtual ~BB() {};
      >
      };
      >
      BB<int,5b;
      >
      int main()
      {
      return 0;
      >
      }
      >
      Although I didn't do any other changes, I cannot compile it
      (with GNU C++ 4.1.0). I receive the following errors:
      >
      And my question is: what's wrong? What mistake I'm doing here?
      Or is this a compiler's bug?
      For what it's worth, this compiles and runs on Visual Studio. That
      doesn't necessarily mean it's a compiler bug in g++, it could be an
      extension or a bug in VS.

      Michael

      Comment

      • Przemyslaw Koprowski

        #4
        Re: Templates and inheritance

        On Fri, 30 Mar 2007 18:52:42 +0000, red floyd wrote:
        virtual typename AA<T>::A getA().
        >
        And remove the BB:: inside getA
        >
        virtual typename AA<T>::A getA() { return A(); }
        >
        Thanks. It works, now.

        Przemek




        Comment

        • red floyd

          #5
          Re: Templates and inheritance

          Przemyslaw Koprowski wrote:
          On Fri, 30 Mar 2007 18:52:42 +0000, red floyd wrote:
          >virtual typename AA<T>::A getA().
          >>
          >And remove the BB:: inside getA
          >>
          >virtual typename AA<T>::A getA() { return A(); }
          >>
          Thanks. It works, now.
          >
          Przemek
          By the way, I believe g++ complaining about BB:A() is an error in g++.
          Comeau likes

          virtual typename AA<T>::A getA() { return BB::A(); }

          Comment

          Working...