Bir sınıf şablonunda statik üye başlatma


154

Bunu yapmak istiyorum:

template <typename T>
struct S
{
    ...
    static double something_relevant = 1.5;
};

ama yapamam çünkü something_relevantintegral tipinde değil. Bağımlı değildir T, ancak mevcut kod, statik bir üyesi olmasına bağlıdır S.

S şablon olduğu için tanımı derlenmiş bir dosyanın içine koyamıyorum. Bu sorunu nasıl çözerim?


Ayrıca geçerlidir std::stringyazın
Trevor Boyd Smith

C ++ 11'den beri, satır içi anahtar kelime değişti, böylece statik değişkenler bildirim noktasında başlatılabilir. Bu nedenle, bunun bildirimi "satır içi statik double something_relevant = 1.5;" gibi görünür.

@ user8991265 Satır içi değişkenlerin C ++ 11'den değil, C ++ 17'den beri mevcut olduğuna inanıyorum.
zupazt3

Yanıtlar:


203

Bunu başlıkta tanımlamanız yeterlidir:

template <typename T>
struct S
{
    static double something_relevant;
};

template <typename T>
double S<T>::something_relevant = 1.5;

Bir şablonun parçası olduğundan, tüm şablonlarda olduğu gibi, derleyici bunun yalnızca bir kez tanımlandığından emin olacaktır.


4
@sbi: tek tanım kuralını ihlal etmiyor mu?
Alexandre C.

7
Hayır, şablonlardan bahsediyorsak değil. Aksi takdirde işlev şablonları da aynı şeyi yapar.
sbi

1
@sbi, @Prasoon: Aslında Prasoon ilk gibi görünüyor. Ama yine de ODR hakkındaki yorumlardan dolayı sbi'leri kabul ediyorum (ki bu benim birincil endişemdi).
Alexandre C.

1
@sbi sadece metnin üzerine gelin :)
Johannes Schaub - litb

5
@Johannes: Kahretsin, bir yıldır buradayım ve bunu bilmiyordum! Başka neyi özlüyorum? (Oy sayısına tıkladığımda görünen iki sayının bir hata değil, bir özellik olduğunu keşfettiğimde hala utanç duyuyorum.) <goes_playing>Vay canına, imleci isminin üzerine geldiğimde, temsilcinizi görüyorum! Bunu da bilmiyordum. @Prasoon: Hayır, haklısın, şimdi olduğu yere yinelemeli olarak geldim. (Bu yüzden cevabınıza yukarı oy verdim, BTW.)
sbi


31

Bu çalışacak

template <typename T>
 struct S
 {

     static double something_relevant;
 };

 template<typename T>
 double S<T>::something_relevant=1.5;

Something_relevant değişkenini tanımlamadım ( template<typename T> double S<T>::something_relevant=1.5;)derleyicinin atma hatasını kaldırdım, lütfen bana nedenini söyler misiniz?
goodman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.