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
-
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; };