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;
// ...
}