我有一个需要重载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 <&,ORT :: MimeType const&)'
collect2:ld返回1退出状态
make:*** [build / x86_64 / bin / libopenrtb.3da2981d03414ced8d640e67111278c1.so]错误1

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

它说:
错误:在struct之前需要初始化
错误:在输入末尾预期“â”
make:***错误1

最佳答案

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

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


我个人将其移至.cpp文件。然后,您也可以将标头中的#include <iostream>移动到.cpp文件,并将#include <iosfwd>添加到标头中,这是一种更苗条的依赖关系。

关于c++ - 如何在结构中重载流,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28312029/

10-11 16:00