: çı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?
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. –
@KerrekSB Oh, bunu hiç bilmiyordum. Bunu bir cevap olarak yazmalısın. –
@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