It used to be the case that the skeleton class for interface
I (_sk_I) was derived from class I. This meant
that the names of any types declared in the interface were available
in the scope of the skeleton class. This is no longer true. If you
have an interface:
interface I {
struct S {
long a,b;
};
S op();
};
then where before the implementation code might have been:
class I_impl : public virtual _sk_I {
S op(); // _sk_I is derived from I
};
I::S I_impl::op() {
S ret;
// ...
}
it is now necessary to fully qualify all uses of S:
class I_impl : public virtual _sk_I {
I::S op(); // _sk_I is not derived from I
};
I::S I_impl::op() {
I::S ret;
// ...
}