Gdy próbuję skompilować następujący kod w C++ 0x, pojawia się błąd:Błąd przy użyciu constexpr jako parametr szablonu w tej samej klasie
template<int n> struct foo { };
struct bar {
static constexpr int number() { return 256; }
void function(foo<number()> &);
};
z GCC 4.6.1, komunikat błędu jest :
test.cc:6:27: error: ‘static constexpr int bar::number()’ used before its definition
test.cc:6:28: note: in template argument for type ‘int’
ze szczęk 2,8, wiadomość o błędzie jest:
test.cc:6:20: error: non-type template argument of type 'int' is not an integral
constant expression
void function(foo<number()> &);
^~~~~~~~
1 error generated.
Jeśli przeniesiona constexpr
do podstawy C lass, to działa na gcc i daje ten sam komunikat o błędzie brzękiem:
template<int n> struct foo { };
struct base {
static constexpr int number() { return 256; }
};
struct bar : base {
void function(foo<number()> &);
};
jest kod źle, czy jest to ograniczenie lub błąd na realizację C++ 0x gcc 4.6 za? Jeśli kod jest nieprawidłowy, dlaczego jest błędny i jakie klauzule standardu C++ 11 mówią, że jest niepoprawny?
Hmm .. Myślę, że właśnie o tym rozmawialiśmy wcześniej: definicje funkcji inline są traktowane tak, jakby były one definiowane po prostu * * definicja klasy; więc w definicji klasy nie są jeszcze dostępne. Zauważ, że zamiast tego zawsze można wymówić 'static const int number = 256;' lub 'static constexpr int number = 256;'. –
@KerrekSB oh, nigdy o tym nie wiedziałem. Powinieneś napisać to jako odpowiedź. –
@KerrekSB: AFAIK, jeśli użyję 'static const int number = 256;', potrzebuję również 'const int bar :: number;', które mogłoby marnować 4 niepotrzebne bajty na '.data'. Użycie funkcji inline zapobiega temu. Nie mam pojęcia, czy tak jest również w przypadku 'static constexpr int number = 256;'. – CesarB