Graham.Parrington@newcastle.ac.uk (Graham D. Parrington) (03/14/91)
According to the ARM (pp310) the scopes of derived and base classes
are different - however, they must be related otherwise name lookup
would not be able to find inherited attributes. The question is how
are they related? Consider the following:
struct A
{
int a;
};
struct B : public A
{
struct A { int ba; };
int A();
};
struct C : public B
{
A *p;
};
What is the type of C::p ?
As the example stands cfront2.1 chooses the global type A. This seems to
imply that the lookup of A was done at global scope (it did not find either
the type B::A or the function B::A() - which should have hidden global A if
the scope of B enclosed that of C)
Remove the function B::A() and things change, C::p now gets type B::A - ie
the nested type A
Put the function B::A() back and remove struct B::A and the example will
not compile!
These latter two results seem to imply that the lookup for A fails in C
and is continued in B - finding either the type or the function if only
one is present which seems logical. The anomoly appears to be the first
result where despite the presence of a matching name, lookup continues to
global scope.
So, what exactly is the relationship between the scopes of A&B and B&C
and how are names supposed to be resolved in such cases?
EMAIL = Graham.Parrington@newcastle.ac.uk
POST = Computing Laboratory, The University, Newcastle upon Tyne, UK NE1 7RU
VOICE = +44 91 222 8067 FAX = +44-91-222-8232