重载<<函数(记录器类)的C++链接
C++ linking for an overloaded << function (logger class)
我目前正在为我的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。
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- 如何显式调用运算符<<
- 模板操作员&lt;未打电话
- C / CUDA中的模板方法是3个角括号(&lt;&lt;&lt;)
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- C 建造者Clang STD :: Sill,找不到超载的操作员&lt;
- 为什么STD :: MAP需要操作员&lt;以及我如何写一个
- 为什么“操作员”需要const但不是为“运营商&lt;”
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 左角支架解释为操作员&lt;而不是模板参数
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- 超载操作员&lt;&lt; - 必须是二进制操作员
- 没有匹配的“运营商&lt;&lt;”