g++ 3.4.0 : C++ templates' error messages

Shelly Adhikari shelly@interrasystems.com
Wed May 12 01:20:00 GMT 2004


Hello Guys,

The following code compiled fine with gcc 3.3.3, but is giving me errors 
in gcc 3.4.0. Uncommenting any of the two commented lines, removes the 
error. Is the uncommented code incorrect [an explanation or citing the 
relevant section of the C++ standard would be nice], or is it a bug in 
3.4.0? If it is not a bug, the error message should be made clearer, if 
possible.

template <class T> class A;
template <class T> class B;
template <class T> class C;
template <class T> class D;
template <class T> class A {
protected:
   int a;
   A() { }
   virtual ~A() { }
   virtual bool IsB() const = 0;
   friend class D<T>;
   friend class C<T>;
};
template <class T> class B : public A<T> {
protected:
   int b;
   B() { }
   virtual ~B() { }
   bool IsB() const { return true; }
   bool PB() { return true; }
   friend class C<T>;
   friend class D<T>;
   friend bool C<T>::CC(A<T>* a) const;
};
template <class T> class C : public A<T> {
protected:
   int c0;
   A<T>**    c1;
   C() { c1 = new A<T>* [10];}
   virtual ~C() { delete [] c1;}
   bool IsB() const { return false; }
//public:
   bool CC(A<T>* a) const
   {
       if (IsB() == true)
       {
           B<T>* b = dynamic_cast<B<T>*>(c1[0]);
           b->PB();
       }
       return true;
   }
   //friend class B<T>;
   friend class D<T>;
};
template <class T> class D {
private:
   C<T>*    d;
public:
   D() { d = new C<T>; };
   ~D() { delete d; };
   bool DD() const { return d->CC(0); }
};
class T {
   int t;
public:
   T() { }
   ~T() { }
};
int main() {
   D<T>* pdt;
   pdt = new D<T>;
   pdt->DD();
   return 0;
}
shelly@redhat[1202] /usr/local/gcc3.3.3/bin/g++ b.cxx
shelly@redhat[1203] /usr/local/gcc3.4.0/bin/g++ b.cxx
b.cxx: In instantiation of `B<T>':
b.cxx:41:   instantiated from `bool C<T>::CC(A<T>*) const [with T = T]'
b.cxx:56:   instantiated from `bool D<T>::DD() const [with T = T]'
b.cxx:69:   instantiated from here
b.cxx:38: error: `bool C<T>::CC(A<T>*) const [with T = T]' is protected
b.cxx:19: error: within this context
TIA
Shelly



More information about the Gcc mailing list