R
red floyd
Przemyslaw said: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,5> b;
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(); }