Re: conversion to non-scalar type error in inheritance hierarchy
It may be easiest to write a templated wrapper that uses some underlying
conventional named methods interface to provide STL iterator functionalit=
y.
Thanks for the hint. Could you give a small code snippet to ease my
understanding? That would be great!
I see the problem with the inheritance 'in the wrong way' now. Also,
thanks for this.
Cheers,
Kay
On Oct 29, 4:43 pm, "Alf P. Steinbach" <al...@start.no> wrote:
* kmw:
Hello,
I am working on container class with different implementations and
want to add stl-style iterators.
It may be easiest to write a templated wrapper that uses some underlying
conventional named methods interface to provide STL iterator functionalit=
y.
Now, I am confronted with a
"conversion to non-scalar type" error which I do not understand. Any
comments are appreciated. Many thanks in advance!
The interface for the different implementations is defined in the base
class A. A1 is one implementation. B is the iterator base class and C
its implementation in A1. I really do not see a problem since C
inherits from B but the compiler says:
test.cpp: In function =91int main()':
test.cpp:34: error: conversion from =91A<int>::B' to non-scalar type
=91A1<int>::C' requested
Best regards,
Kay
Code:
template <class X>
class A
{
public:
class B
{
public:
virtual ~B () {}
virtual void met=
hod () {}
};
virtual ~A () {}
virtual B begin ()=0;
};
template <class X>
class A1 : public A<X>
{
public:
class C : public A<X>::B
{
public:
~C () {}
void method ( ) =
{}
};
~A1 () {}
typename A<X>::B begin ( )
{
C test;
return test;
}
Not related to the compilation error, but a logical error: this begin() f=
unction
always produces an A<X>::B object. It doesn't matter that that object is
initialized from a C object. When it's returned it's a B object, and call=
s to
method will invoke B::method.
};
int main ( )
{
A1<int> test;
A1<int>::C test_it = test.begin ();
test.begin() produces a B object. Class C does not provide any constructo=
r that
takes a B object. A B object cannot be implicitly converted down to the m=
ore
specialized C object (the inheritance goes the wrong way).
return 0;
}
Cheers & hth.,
- Alf