prywatna subklasa: auto vs jawny typ

0

Dlaczego zapis 1 jest niedozwolony, a zapis 2 już tak? Czy da się zapis 1 przerobić tak, żeby jawnie podać typ?

Kod:

#include <cstdio>

class A
{
private:
  class B
    {
    public:
      B() { printf("A::B::B();\n"); }
      void a() const { printf("A::B::a();\n"); }
      void b() const { printf("A::B::b();\n"); }
    } b;
public:
  const B& getB() { return b; }
  A() { printf("A::A();\n"); }
};

int main()
{
  A a;
  a.getB().a();
  a.getB().b();
  //const A::B& b = a.getB(); // 1
  auto b = a.getB(); // 2
  b.a();
  b.b();
  return 0;
}
0

http://www.mail-archive.com/[email protected]/msg359491.html

Wygląda na to, że typ prywatny w C++ chroni tylko jego.. nazwę ;).

0

Interesujące. Łyka to Visual 11 Beta, łyka Clang 3.0, łyka GCC 4.8 i 4.6.2.
Jest to nawet zgłoszone jako bug w GCC:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52965

Ciekawe co na to standard – nie chce mi się teraz szukać. Może to luka w standardzie, a może bug w kompilatorach... ;-)

0

Wydaje mi się, że to nie powinno działać. Skoro nie działa ręczna deklaracja prawidłowego typu to dlaczego miało by działać auto? typeid mówi, że jest to typ N1A1BE, wie ktoś może jak to rozszyfrować? (GCC i Clang taki zwracają)

0

może tworzy sobie w jakiś automagiczny sposób typedef'a w publicznej sekcji klasy i przez niego się odwołuje, bo przykładowo ten kod się skompiluje:

public:
  const B& getB() { return b; }
  A() { printf("A::A();\n"); }
  typedef B BB;

(...)
//gdzies w main
const A::BB& b = a.getB(); // 1

1 użytkowników online, w tym zalogowanych: 0, gości: 1