2016-12-30 43 views
22

, bağlayıcı o fonksiyonu bağlantı alamamaktan şikayetçi :Hata mesajı "şablon parametresi olarak geçirilen şablon işlevi tanımsız başvuru"

$ g++ -o test2 test2.cpp && ./test2 
/tmp/ccahIuzY.o: In function `Base<&(int identity<10>())>::f()': 
test2.cpp:(.text._ZN4BaseIXadL_Z8identityILi10EEivEEE1fEv[_ZN4BaseIXadL_Z8identityILi10EEivEEE1fEv]+0xd): undefined reference to `int identity<10>()' 
collect2: error: ld returned 1 exit status 

Uzmanlığı açıklarsam, kod beklendiği gibi derler ve bağlar. Ayrıca, Base<identity<10> > yerine Base<identity<Val> >'dan miras kalırsam, kod beklediğim gibi çalışır.

burada deneyin: http://coliru.stacked-crooked.com/a/9fd1c3aae847aaf7

Ben neyi özlüyorsun?

+3

Bu sorun bir gcc hata olduğunu tahmin etmekteyiz: o derler ve clang ve icc ile Tamam bağlantılar kullanımların herhangi değişmiyor potansiyel-etrafında çalışma bir işlevi yerine bir sınıf şablonu identity kullanılması olacaktır. BTW, _identity() _ adı normalde sonucun argümanla aynı olduğu dönüşüm için kullanılır. –

+0

@ DietmarKühl Eh, 'kimlik ()', 'X' i döndürür. :-) – melpomene

+2

Çözüm: sınıfı Türetilmiş: public Base (kimlik <10>)> '. [canlı demo] (http://melpon.org/wandbox/permlink/E4aRHqcZaac7vd3C) –

cevap

19

Sorun bir gcc hatadır görünüyor: Kod derler ve çınlama, icc ve EDG kullanıcı arabirimi ile bağlantıları.

template<int I> 
struct identity { 
    operator int() { return I; } 
}; 

template<typename fn> 
class Base { 
public: 
    int f() { 
     return fn(); 
    } 
}; 
+0

"Inline" işlev şablonunu yapmamak da işe yarayabilir. Bağlayıcının yinelenen şablon örneklemelerini kaldırması gerekmez mi? – Etherealone