我写了一个小的 Timer 类来检查我的代码的性能。源代码可以在这里找到http://pastebin.com/i1PX2VPN(稍后我将在此处突出显示重要部分)
现在我遇到了一个非常奇怪的错误:上面链接的代码在 Timer.hpp 文件中。我在我的 main.cpp 中使用了这个文件,它工作得很好。但是,我也想在另一个源文件中使用它,然后,只要我添加一个
#include <Timer.hpp>
进入下一个源文件,我得到以下链接器错误:
ld: duplicate symbol operator<<(std::basic_ostream<char, std::char_traits<char> >&, Timer const&) in /var/folders/XZ/XZ93KWBqG0SR1aCVpTCVQE+++TI/-Tmp-//ccyaHyyU.o and /var/folders/XZ/XZ93KWBqG0SR1aCVpTCVQE+++TI/-Tmp-//ccETAaTw.o
collect2: ld return 1 as exit status
make: *** [debugd] Error 1
功能是
std::ostream& operator<<(std::ostream& os, const Timer& t) {
return os << std::scientific << std::setw(8) << std::setprecision(3)
<< t.timeTotal_ << " \t " << t.timeMin_ << " \t " << t.timeMax_;
}
没什么太花哨的......再次:只要它只包含在我的 main.cpp 中,它就可以工作
显然,这似乎是运算符的多个定义(?)的问题。但我不明白为什么或如何解决它。我使用 include-guards 来避免它被多次包含。
我已经检查过我从未听说过的 C++ 库中的其他任何地方是否还有另一个 Timer 类,这显然不是这种情况(重命名该类无论如何都不会改变任何东西)......
在 Timer.hpp 中,还定义了另一个类,也有自己的 operator<< 重载。我不知道这是否重要,我只是觉得我应该提一下
所以...我期待着您的想法,谢谢