如何在struct中重载流

时间:2015-02-04 01:36:45

标签: c++

我有一个名称空间需要重载ostream进行编译,当我在结构中添加时,它会抱怨两个参数,只有一个允许,当我在结构后面添加时,仍然没有编译:

namespace ORT {

struct MimeType {
     MimeType(const std::string & type = "")
    : type(type)
    {
    }
    std::string toString() const { return std::string(type); }
    std::string type;        
};    
std::ostream& operator<< (std::ostream& stream, const MimeType& mt) {
   std::cout << mt.type;
return stream;
}
...

它说:在函数ORT::operator<<(std::basic_ostream<char, std::char_traits<char> >&, ORT::MimeType const&)': /ort.h:56: multiple definition of ORT :: operator&lt;&lt;(std :: basic_ostream&gt;&amp;,ORT :: MimeType const&amp;)'中 collect2:ld返回1退出状态 make:*** [build / x86_64 / bin / libopenrtb.3da2981d03414ced8d640e67111278c1.so]错误1

但我只包含ostream,没有多个实例。 当我只提出:

它说: 错误:在结构之前的预期初始化程序 错误:预期â在输入结束时 make:***错误1

1 个答案:

答案 0 :(得分:3)

这种情况正在发生,因为您在头文件中定义了一个未标记为inline的函数。将operator <<的定义移至相应的.cpp文件,或添加inline关键字:

inline std::ostream& operator<< // ...

我个人将它移动到.cpp文件。然后,您也可以将标题中的#include <iostream>移动到.cpp文件中,并将#include <iosfwd>添加到标题中,这是一个较小的依赖项。