重载<<函数(记录器类)的C++链接

C++ linking for an overloaded << function (logger class)

本文关键字:lt C++ 链接 函数 重载 记录器      更新时间:2023-10-16

我目前正在为我的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)

日志记录器。o文件被正确包含,因为Logger::init()函数工作正常并且不会引发任何链接错误。谢谢:)

由于您有非内联模板,因此需要强制实例化。

要做的简单的事情是将Logger::operator<<模板放在头文件中。编译器将自动实例化它需要的版本,链接器将删除重复的版本(好吧,至少是那些没有内联的版本)。

你不需要强制实例化,除非你的链接器是旧的(例如gcc 2.7或更早)。

这是模板代码的一般规则:把定义放在头文件中,除非你有很好的理由不这样做。

参见为什么模板只能在头文件中实现?div。