Hata

2011-11-12 30 views
6
, bir hata alıyorum

: çınlama 2.8 ileHata

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’ 

, hata iletisi:

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. 

bir baz c constexpr işlevi taşımak durumunda lass, bu gcc üzerinde çalışır ve clang aynı hata mesajı verir:

template<int n> struct foo { }; 

struct base { 
    static constexpr int number() { return 256; } 
}; 

struct bar : base { 
    void function(foo<number()> &); 
}; 

kodu yanlış mı yoksa C++ 0x ait gcc 4.6 en uygulanmasına ilişkin bir sınırlama veya hatayı? Kod yanlışsa, neden yanlıştır ve C++ 11 standardının hangi maddeleri yanlış olduğunu söyler?

+2

Hmm .. Bence az önce ele bu daha önceki: inline fonksiyonu tanımları davranılır tanımlandıkları sanki * hemen sonra * sınıf tanımı; sınıf tanımının içinde henüz mevcut değiller. Her zaman statik const int sayı = 256; 'veya' static constexpr int number = 256; 'diyebileceğinizi unutmayın. –

+0

@KerrekSB Oh, bunu hiç bilmiyordum. Bunu bir cevap olarak yazmalısın. –

+0

@KerrekSB: AFAIK, eğer statik const int sayı = 256; kullanıyorum, ayrıca '.data'ya 4 işe yaramaz bayt israf edecek bir const int bar :: number;' gerekir. Satır içi bir işlev kullanmak bunu engeller. Bununla birlikte, bu durumun static constexpr int number = 256; 'için de geçerli olup olmadığı hakkında hiçbir fikrim yok. – CesarB

cevap

5

C++ 'da, sınıf için üye işlevlerinin satır içi tanımları, yalnızca sınıftaki her bildirimin ayrıştırılmasından sonra ayrıştırılır. Bu nedenle, ilk örneğinizde, derleyici,bildirildiği noktada number() tanımını göremez.

(clang hiçbir yayımlanan sürümü constexpr fonksiyonlarının değerlendirilmesi için desteği vardır, bu nedenle testcases hiçbiri çalışacaktır.)

1

Aşağıdaki kod ile simillar hata var:

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

"error: 'constexpr Test :: Sub :: Sub (int)' sabit bir ifadede çağrıldı" gcc 4.7.1. Bu başarıyla derlemek olurken:

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

Lütfen, yalnızca katkıda bulunduğunuz bir şey varsa, bir cevap verin * kullanıcının * sorduğu soruya cevap verir. Yayınladığınız şey daha fazla yorum olarak kabul edilir. Bu, siteyi daha fazla kullanmanız için yayınlama ayrıcalığını kazanır. S.O'ya katıldığınız için teşekkürler. ve hoşgeldin. – David