geschachtelte template Klassen mit statischen Datenmember und Spezialisierung in g++



  • Hallo,

    ich habe ein merkwürdiges Verhalten von g++ (v4.2.3) entdeckt. Ich vermute es handelt sich um einen compiler bug - aber ich möchte die Sache erstmal zur Diskussion stellen, bevor ich einen bug report einsende.

    Hier der Problemcode:

    #include <iostream>

    using namespace std;

    template< unsigned int D >
    struct A
    {
    template< unsigned int Mask >
    struct B
    {
    static const int value = Mask;
    };

    template< unsigned int Mask >
    struct C : public B< Mask > {};
    };

    /*
    * specialize inner struct B for a template argument of the outer struct A.
    * -- should have no effect
    */
    template<>
    template< unsigned int Mask >
    struct A< 3 >::B< Mask >
    {
    static const int value = Mask;
    };

    const unsigned int mask = 1;

    int main()
    {
    cout << A< 2 >::B< mask >::value << endl // 1 - as expected
    << A< 2 >::C< mask >::value << endl // 1 - as expected
    << A< 3 >::B< mask >::value << endl // 1 - as expected
    << A< 3 >::C< mask >::value << endl; // 3 - ???

    return 0;
    }

    Ich habe also zwei geschachtelte template Klassen und möchte die innere Klasse für ein template Argument der äußeren Klasse spezialisieren. Ich finde den Code logisch - allerdings weiß ich nicht, ob er Standardkonform ist. Evtl. ist es nötig die komplette Klasse A für das Argument '3' nochmal neu zu schreiben (eine perfekte 1:1-Kopie), damit ich die innere Klasse spezialisieren kann.
    Allerdings: weder der Intel- noch der Sun-Compiler haben Probleme mit diesem Code - beide geben auch beim letzten cout eine '1' aus.

    Also: habe ich hier einen g++ bug oder nicht Standard-konformen Code?

    mfg,
    cathune


  • Mod

    Sieht wie ein Bug aus. Tritt er auch auf, wenn du auf die (zumindest hier nicht sonderlich sinnvolle) partielle Spezialisierung von A<3>::B verzichtest, und statt dessen A<3>::B neu definierst? Also

    template<>
    template< unsigned int Mask >
    struct A< 3 >::B
    {
    static const int value = Mask;
    };
    

Anmelden zum Antworten