A veces, la noción de privacidad C++ 's me acaba de deflectores :-)delegar en partes privadas
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
}
Desde Foo::Bar
es private
, no puedo declarar b
en main
. Sin embargo, puedo llamar a los métodos desde Foo::Bar
bien. ¿Por qué demonios esto está permitido? ¿Fue eso un accidente o por diseño?
Oh, espera, se pone mejor:
Foo f;
auto x = f.operator->(); // :-)
x->baz();
A pesar de que no se me permite nombrar el tipo Foo::Bar
, funciona muy bien con auto
...
Noah escribió:
tipo Los nombres definidos dentro de una definición de clase no se pueden usar fuera de su clase sin calificación.
Sólo por diversión, aquí es cómo se puede conseguir en el tipo de fuera:
#include <type_traits>
const Foo some_foo();
typedef typename std::remove_pointer<decltype(some_foo().operator->())>::type Foo_Bar;
Para abreviar el ejemplo del código, básicamente se está preguntando si es legal por diseño devolver un tipo privado ('Foo :: Bar *') desde una función miembro pública ('Foo :: operator ->()')? – stakx
@stakx Hmmm, supongo que sí :) +1 – fredoverflow
En cuanto al ejemplo del código 'auto', pensé que era la abreviatura de' auto int'. ¿Esto realmente compila y se ejecuta correctamente? – stakx