C++: Seltsame "privat" Fehler

Ich habe immer einen sehr ungewöhnlichen Fehler von g++ zu fordern, dass ein Typ-alias ist privat. Nach Stunden der Reduzierung meinem code habe ich kam auf die folgenden minimalen Testfall:

template <typename Dummy>
class Test {
    struct CatDog {
        static void meow ()
        {
            CrazyHouse::TheCatDog::meow();
        }

        struct Dog {
            static void bark ();
        };
    };

    struct CrazyHouse {
        using TheCatDog = CatDog;

        static void startMadness ()
        {
            TheCatDog::meow();
            TheCatDog::Dog::bark();
        }
    };

public:
    static void init ()
    {
        CrazyHouse::startMadness();
    }
};

int main ()
{
    Test<void> t;
    t.init();
}

Den Fehler mit dem g++ 4.8.2 ist:

test.cpp: In instantiation of 'static void Test<Dummy>::CatDog::meow() [with Dummy = void]':
test.cpp:19:29:   required from 'static void Test<Dummy>::CrazyHouse::startMadness() [with Dummy = void]'
test.cpp:27:34:   required from 'static void Test<Dummy>::init() [with Dummy = void]'
test.cpp:34:12:   required from here
test.cpp:15:33: error: 'using TheCatDog = struct Test<void>::CatDog' is private
         using TheCatDog = CatDog;
                                 ^
test.cpp:6:41: error: within this context
             CrazyHouse::TheCatDog::meow();
                                         ^

Clang 3.4 nimmt den gleichen code. Was ist denn hier Los, ist das eine g++ Fehler?

Tut jeder der folgenden Haltestellen der Fehler auftreten:

  • Drehen Test in eine Klasse, im Gegensatz zu einem template-Klasse.
  • Entfernen von Anweisungen in jedem der den Funktionen.
  • Ändern TheCatDog::Dog::bark(); zu CatDog::Dog::bark();.
  • Entfernen der CrazyHouse Klasse und die Zusammenführung Ihrer Inhalte in Test.
  • Entfernen der CatDog Klasse, die Zusammenführung Ihrer Inhalte in Test und die änderung der TheCatDog alias zeigen Test.
  • Wahrscheinlich ja.
Schreibe einen Kommentar