C ++链接为重载<<功能(记录器类)

时间:2011-12-06 23:07:27

标签: c++ linker

我目前正在为我的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 个答案:

答案 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?