2011-12-06 94 views
2

我目前正在爲我的C++項目編寫一個記錄器(我需要它接近無依賴性,所以我不想採取預先寫的)。它包含了這樣的功能:C++鏈接爲一個重載的<<函數(記錄器類)

template <typename T> 
Logger& Logger::operator<<(T f) { 
    m_file<<f; 
    return *this; 
} 

的logger.cpp代碼編譯,但是當我打電話的日誌功能,在我main.cpp中,我有這樣的編譯器錯誤:

/home/tuxer/prog/cpp/PRay/server/src/main.cpp:110: undefined reference to `Logger& Logger::operator<< <int>(int)' 

這行代碼:

log<<lul; (lul being a int variable equals to 2) 

正確包含logger.o文件,因爲Logger :: init()函數可以正常工作,並且不會引發任何鏈接錯誤。 謝謝:)

回答

2

簡單的事情就是將Logger::operator<<模板放在頭文件中。編譯器會自動實例化它需要的版本,並且鏈接器將刪除重複項(至少那些未被內聯的項)。

除非鏈接器是舊的(例如gcc 2.7或更低版​​本),否則不應強制實例化。

這是模板代碼的一般規則:除非你有充分的理由,否則將定義放在頭文件中。

另請參閱Why can templates only be implemented in the header file?

+0

作品很有魅力,非常感謝。 – Tuxer