2011-03-24 27 views
14
##A.hh 

template<class T> void func(T t) {} 
template<> void func<int>(int t) {} 

void func2(); 

##A.cpp 

void func2() {} 

##main.cpp 

func("hello"); 
func(int()); 

I elde hatadır: hata LNK2005: önceden a.obj tanımlanan "void __Cdecl fonk (int)" (?? $ fonk 'H @@ YAXH ZZ), bir ya da daha fazla tanımlı tanımlı simge bulunduişlevi şablon uzmanlık derleme hatası

Bir işlev şablonu uzmanlığı normal işlev şablonu olarak değerlendirilmiyor mu? Bu, A.

+0

'func2' bu işle ne ilgisi var inline yapmak: Yani buna göre hareket etmelidir? –

+0

Hata mesajınızdan VC kullandığınızı kabul ediyorum. Programınız benim için iyi çalışıyor VS2005 – mkaes

+0

@ Space_C0wb0y Yani ben bir şey vardı A.cpp dosyasına koymak için – hidayat

cevap

26

için objektif dosyada olduğu gibi görünür. template<> void func<int>(int t) {}, bir işlev şablonundan ziyade bir işlev aşırı yüküdür (yani, tanım noktasındaki tüm şablonlar artık şablon olmadığı için); Diğer tüm işlev tanımlarında olduğu gibi, çoklu tanım hatalarından kaçınmak için inline olarak işaretlenmiş veya .cpp dosyasında tanımlanmış olmalıdır. aşağıdaki gibi

+1

Ama eğer normal bir işlev olarak ele alınırsa, o zaman aşırı yüklenmiş bir fonksiyon ile fark nedir: inline void func (int t) {} – hidayat

+4

@hidayat: Aşırı yük çözünürlüğü önceliği tek farktır - şablonlar her zaman şablonlar üzerinde tercih edilir (bkz. 13.3.3). Bu, Herb Sutter tarafından 'Daha Olağanüstü C++' adlı kitapta ayrıntılı olarak ele alınmıştır. – ildjarn

10

sorundur: Tam şablon uzmanlık daha bir sıradan fonksiyonu gibi, artık bir şablon olduğunu.

  • cpp dosyası

  • içinde func<int>() birini koymak tanımı veya

İlgili konular