我目前正在为我的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()函数正常工作,并且不会引发任何链接错误。 谢谢:))
答案 0 :(得分:3)
由于您具有非内联模板,因此需要强制实例化。请参阅示例How do I force a particular instance of a C++ template to instantiate?。
答案 1 :(得分:2)
简单的做法是将Logger::operator<<
模板放在头文件中。编译器将自动实例化它需要的版本,链接器将删除重复项(好吧,至少是那些没有内联的版本)。
除非你的链接器是旧的(例如gcc 2.7或更早版本),否则你不需要强制实例化。
这是模板代码的一般规则:将定义放在头文件中,除非你有充分的理由不这样做。
同样请参阅Why can templates only be implemented in the header file?。