首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自重载的<<运算符的奇怪的链接器错误- C++

来自重载的<<运算符的奇怪的链接器错误- C++
EN

Stack Overflow用户
提问于 2013-04-05 02:28:51
回答 2查看 797关注 0票数 1

我写了一个小的定时器类来检查代码的性能。源代码可以在这里找到http://pastebin.com/i1PX2VPN (我将在后面重点介绍重要的部分)

现在我遇到了一个非常奇怪的错误:上面链接的代码在一个Timer.hpp文件中。我在我的main.cpp中使用了这个文件,它工作得很好。但是,我还想在另一个源文件中使用它,然后,一旦我添加了一个

代码语言:javascript
复制
  #include <Timer.hpp> 

在下一个源文件中,我得到以下链接器错误:

代码语言:javascript
复制
  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

该函数为

代码语言:javascript
复制
 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<<重载。我不知道这件事是否重要,我只是觉得我应该提一提

所以..。我期待着你的想法,谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-05 02:30:16

您应该将您的函数标记为inline,因为它是一个全局函数,其定义包含在多个翻译单元中。

代码语言:javascript
复制
    inline 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_;
    }

或者,您可以将函数的声明保留在头文件中,而将定义放在单个.cpp文件中。

如果你想知道为什么include guards不能将你从多个符号定义中解救出来,你可能会发现很有用。

票数 8
EN

Stack Overflow用户

发布于 2013-04-05 02:30:07

包含保护仅防止文件在同一翻译单元中被多次包含。如果将其包含在单独编译的两个不同的.cpp文件(通常是.cpp文件)中,则有多个定义。

把它放在一个实现文件中,在头文件中只留下一个声明。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15818901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档