Posted in Software Development on 22 Dec 2017 at 15:29 UTC
Today I was writing some C++ and wanted to add a private struct within a class for storing some data, but not just any struct - I wanted a private abstract base struct with a couple of implementations.
So I wrote something like this:
class Thing { private: struct PrivateAbstract { struct A; }; struct PrivateAbstract::A: public PrivateAbstract // <-- Line 8 { }; };
That didn't compile, GCC gave me the following error and Google wasn't terribly helpful when I searched for it:
/home/solemnwarning/test.cpp:8:3: error: ‘struct Thing::PrivateAbstract::A’ redeclared with different access
Whats happening, is that the initial declaration of A
inside PrivateAbstract
declares PrivateAbstract::A
as public, but only in the context of PrivateAbstract
, it still wouldn't be valid for anything outside of the Thing
class to use it.
The compiler sees defining PrivateAbstract::A
in a private block in Thing
as changing the protection (relative to PrivateAbstract
) from public to private, which isn't allowed. Changing the code as follows fixed it in the way I wanted:
class Thing { private: struct PrivateAbstract { struct A; }; public: struct PrivateAbstract::A: public PrivateAbstract { }; };
Despite how it looks, PrivateAbstract::A
is still private to Thing
, it can use it, but nothing outside of it can.
Perhaps obvious to someone more experienced with C++, but it took me a long time to figure out exactly what was happening.
No comments have been posted