2011-11-12 7 views
6

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?

+2

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;'. –

+0

@KerrekSB oh, nigdy o tym nie wiedziałem. Powinieneś napisać to jako odpowiedź. –

+0

@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

Odpowiedz

5

W języku C++ wbudowane definicje funkcji składowych klasy są analizowane tylko po przeanalizowaniu wszystkich deklaracji w klasie. Dlatego w pierwszym przykładzie kompilator nie widzi definicji number() w miejscu, gdzie zadeklarowano function().

(Nie wydana wersja brzękiem posiada wsparcie dla oceny funkcji constexpr, więc żaden z testami będzie tam pracować.)

1

Mam zblizonym błąd z następującego kodu:

struct Test{ 
    struct Sub{constexpr Sub(int i){}}; 
    static constexpr Sub s=0; 
}; 

"error: 'constexpr Test :: Sub :: Sub (int)' wywołany w wyrażeniu stałym" na gcc 4.7.1. gdy ten zostanie skompilowany z powodzeniem:

struct Sub{constexpr Sub(int i){}}; 
struct Test{ 
    static constexpr Sub s=0; 
}; 
+4

Podaj odpowiedź tylko wtedy, gdy przyczyna Twojego autorstwa * odpowie * * pytanie, które poda użytkownik. To, co zamieściłeś, jest uważane za raczej komentarz, który uzyskasz z uprawnieniami do publikowania, gdy korzystasz z witryny więcej. Dziękujemy za dołączenie do S.O. i witam. – David

Powiązane problemy