Иногда С++ понятие конфиденциальности просто меня озадачивает: -)
class Foo
{
struct Bar;
Bar* p;
public:
Bar* operator->() const
{
return p;
}
};
struct Foo::Bar
{
void baz()
{
std::cout << "inside baz\n";
}
};
int main()
{
Foo::Bar b; // error: 'struct Foo::Bar' is private within this context
Foo f;
f->baz(); // fine
}
Так как Foo::Bar
есть private
, я не могу объявить b
в main
. Тем не менее я могу просто называть методы из Foo::Bar
. Почему, черт возьми, это разрешено? Это был несчастный случай или по дизайну?
Ой, подождите, становится лучше:
Foo f;
auto x = f.operator->(); // :-)
x->baz();
Даже если мне не позволено называть тип Foo::Bar
, он отлично работает с auto
...
Ной писал (а):
имена типов, определенные в определении класса, не могут использоваться вне их класса без квалификации.
Просто для удовольствия, вот как вы можете получить тип снаружи:
#include <type_traits>
const Foo some_foo();
typedef typename std::remove_pointer<decltype( some_foo().operator->() )>::type Foo_Bar;