Bir şablon işlevini açık bir şekilde nasıl başlatırım?


117

Tek bağımsız değişkenli bir şablon işlevim var. Bu işlevi çağırmadan bu işlevi somutlaştırmalıyım, açıkça somutlaştırmam gerektiği anlamına gelir.

Bu işleve sahibim:

template <class T> int function_name(T a) {}

Bu işlevi şu şekilde somutlaştırdım:

template int function_name<int>(int);

Ama şu hataları aldım:

error: expected primary-expression before 'template'
error: expected `;' before 'template'

Yanıtlar:


182

[DÜZENLEME 2]: Kod biçimlendirme sorunları nedeniyle orijinal sorudaki kodla ilgili bazı karışıklıklar olduğunu unutmayın. Daha fazla ayrıntı için AnthonyHatchkins'in yanıtına bakın.

İşlevi gerçekten başlatmak istiyorsanız (uzmanlaşmak veya başka bir şey yerine), şunu yapın:

template <typename T> void func(T param) {} // definition

template void func<int>(int param); // explicit instantiation.

[DÜZENLE] Açık örnekleme ve uzmanlaşma konusunda (çok) kafa karışıklığı var gibi görünüyor. Yukarıda yayınladığım kod, açık örnekleme ile ilgilidir . Uzmanlaşma sözdizimi farklıdır. İşte uzmanlaşma sözdizimi:

template <typename T> void func(T param) {} // definition

template <> void func<int>(int param) {} // specialization

Şablondan sonra açılı parantezlerin olduğuna dikkat edin!


3
bu örnekleme veya mi uzmanlaşma mı?
Nawaz

5
Doğru değil. Derleyiciye şablonları açıkça başlatmasını söyleyebilirsiniz. Daha fazla ayrıntı için "C ++ açık şablon örneği" için Google.
hrnt

8
@Nawaz: yanılıyorsun. Elbette, somutlaştıran her zaman derleyicidir, bu satır, şablonun somutlaştırılması için programcıdan derleyiciye bir taleptir. C ++ standardının bir kopyasına sahipseniz
David Rodríguez - dribeas

16
Uzmanlık, muhtemelen uygulamasını değiştirdiğiniz anlamına gelir. Örnekleme, basitçe, muhtemelen benzersiz adresini almak veya bir kütüphane işlevi olarak kullanılabilir hale getirmek veya şişkinliği azaltmak için onu belirli bir derleme birimine atadığınız anlamına gelir.
CashCow

3
@hrnt: Sanırım haklısın. @Ashot: Sözdiziminin bir template<>formu olmadığını fark ettim . Yazdıkları uzmanlıktan farklıdır . Bana bu yeni şeyi öğrettiği için +1. Gönderimi kaldırıyorum. : D
Nawaz

20

Kodunuz doğru.

Hata mesajı, kodda burada alıntı yapmadığınız bir yerle ilgilidir.

Güncelleme:

Orijinal kod

template <class T> int function_name(T a) {}
template int function_name<int>(int);

ve doğruydu.

Ama alıntı yapılmadı ve bu yüzden bakıldı benziyordu:

template int function_name(T a) {}
template int function_name(int);

Aşağıdaki hatayı oluşturur

a.cpp:1: error: explicit instantiation of non-template int function_name
a.cpp:1: error: expected `;' before ‘(’ token
a.cpp:3: error: function_name is not a template function

bu, OP'nin bahsettiğinden açıkça farklıdır.

Bu varyantta ikinci satır tamamdır ( <int>burada ihmal edilebilir), ancak ilk satır hatalı. Derleyici Tbunun bir şablon parametresi olduğunu tahmin edemez .


Teknik olarak bu onun kodu değildi, Bill'in düzenlemesiydi :) Orijinal kod template int function_name( T a) { }vetemplate int function_name(int);
hrnt

@hrnt Orijinal kod doğru biçimlendirilmemiş, ancak doğruydu. Ben Balaji olsaydım, yararlı olduğunu düşünürse geri döner ve cevabını kabul ederdim, ancak benim için (ve muhtemelen başkaları için) cevabın (kendi başına tamamen doğruyken) soruyu cevaplamıyor.
Antony Hatchkins

@hrnt Orijinal kodun böyle göründüğü konusunda haklısınız. Ancak çıkarılan şablon argümanı nedeniyle hala çalışıyor. Antony Hatchkins'e, hatanın OP'nin alıntı yapmadığı koddan kaynaklandığı konusunda hemfikir olmak zorundayım, ancak cevabınızın açık örnekleme hakkında bilgisi olmayan kişiler için hala yararlı olduğunu düşünüyorum.
mpark

Mesela beni ele alalım. Açık örnekleme hakkında unutulmuş bilgilerimi tazelemek istediğimde bu sayfayı Google'da araştırdım ve bu bana pek yardımcı olmadı. Bana gelince, sözdizimi konusunda hiçbir kafa karışıklığı yok. Açık örneklemeyle ilgili kafa karışıklığına neden olabilecek şey, kullanımıdır
Antony Hatchkins

@AntonyHatchkins Ah, doğru - Orijinal sorunun kaynağına bakmadım, sadece ekranımda nasıl göründüğüne baktım. Bunu + 1'leyeceğim ve orijinal soruyla ilgili karışıklığı belirtmek için orijinal cevabımı değiştireceğim.
hrnt
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.