可以std :: ostream输出一个const char数组吗?

时间:2016-08-30 02:42:06

标签: c++ operator-overloading ostream

为了获得乐趣和体验,我修改并探索Blobby Volley 2 1.0(Linux)的源代码。

嗯......我修改源代码,但我甚至无法编译程序。 (伤心,不是吗?)

这是导致错误的代码:

std::ostream& operator<<(std::ostream& stream, const ServerInfo& val) {
    return stream << val.name << " (" << val.hostname << ":" << val.port << ")";
    }

尝试使用 g ++ 5.4.0 进行编译,得到以下结果(简化输出 - 原始输出为~443行)错误消息:

  

错误:'operator&lt;&lt;'不匹配(操作数类型为'std :: ostream {aka   std :: basic_ostream}'和'const char [32]')

     

返回流&lt;&lt; val.name&lt;&lt; &#34; (&#34;&lt;&lt; val.hostname&lt;&lt;&#34;:&#34;&lt;&lt; val.port&lt;&lt;&#34;)&#34;;

我将代码简化为:

std::ostream& operator<<(std::ostream& stream, const ServerInfo& val) {
    stream << "hello"; //can't get simpler than this, right?
    return stream;
    }

得到了

  

错误:'operator&lt;&lt;'不匹配(操作数类型为'std :: ostream {aka std :: basic_ostream}'和'const char [6]')

     

stream&lt;&lt; &#34;你好&#34 ;;

调用它的代码如下所示:

std::cout << "duplicate server entry\n";
std::cout << info << "\n"; //it's called here

我发现最令人惊讶的是,我们都知道std::cout及其同类可以处理char数组。

例如,

#include <iostream>
#include <string>

int main () {
    const char a[6] = "hello";
    std::cout << a << std::endl; //No problem here!
    return 0;
    }

毫无障碍地工作。

哦,还有一件事。

如果我加入<string>,则可行:

std::ostream& operator<<(std::ostream& stream, const ServerInfo& val) {
    stream << std::string("hello");
    return stream;
    }

有谁知道我错过了什么?

PS:这里是pastebin of the errors.

PPS:以下是请求的标头:

/* header include */
#include "NetworkMessage.h"

/* includes */
#include <cstring>

#include "UserConfig.h"
#include "SpeedController.h"

PPS: 如果您想知道为什么我没有收到关于std::ostream未定义的错误,请查看Sam的第3段&# 39;答案。

1 个答案:

答案 0 :(得分:11)

#include <iostream>可能遗漏的事实是用Sherlock Holmes的调试方法推断出来的:“当你消除了不可能的事情,无论剩下什么,不管多么不可能,都必须是真理”。

显然。 <{1}}应该在接受std::ostream超载时没有问题。

因此,重载决议投诉必须表示不包含const char *。大多数C ++库类都是在整个地方进行前向声明。包含一些随机头文件可能会为您提供<iostream>的前向声明,作为免费奖励。所以编译器不会抱怨这个类没有被定义。

但除非包含std::ostream,否则编译器将不知道那里定义的所有重载。就是这样。