This example from [namespace.udecl] p10 is exactly the same as yours:
struct B { int i; }; struct X : B { using B::i; using B::i;
The error is supported by [class.mem] p1:
A member should not be declared twice in the member specification, except that a template of a nested class or member class can be declared and then later defined, and moreover, an enumeration can be entered with an opaque declaration, and later updated using an enumerator specifier.
So you're on the right track. Several declarations are in order if they do not violate other rules (for example, one definition, member specifications, etc.).
For example, the following:
struct X; struct X;
Or a more complex example:
struct X { struct A; struct A { int y; }; }; struct X; struct X::A;
source share