std::ostream 不能输出一个 const char 数组吗?
Can't std::ostream output a const char array?
为了获得乐趣和体验,我正在 修改和 探索 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 行)错误消息:
error: no match for ‘operator<<’ (operand types are ‘std::ostream {aka
std::basic_ostream}’ and ‘const char [32]’)
return stream << val.name << " (" << val.hostname << ":" << val.port << ")";
我将代码简化为:
std::ostream& operator<<(std::ostream& stream, const ServerInfo& val) {
stream << "hello"; //can't get simpler than this, right?
return stream;
}
得到了
error: no match for ‘operator<<’ (operand types are ‘std::ostream {aka std::basic_ostream}’ and ‘const char [6]’)
stream << "hello";
调用它的代码如下所示:
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: 这是请求的 headers:
/* header include */
#include "NetworkMessage.h"
/* includes */
#include <cstring>
#include "UserConfig.h"
#include "SpeedController.h"
PPS: 如果您想知道为什么我没有收到关于 std::ostream
的错误未定义,请查看 Sam 回答的第 3 段。
#include <iostream>
可能丢失的事实是使用夏洛克·福尔摩斯的调试方法推断出来的:"when you have eliminated the impossible, whatever remains, however improbable, must be the truth"。
很明显。 std::ostream
接受 const char *
过载应该没有问题。
因此,超载解决方案投诉必须意味着 <iostream>
未包含在内。大多数 C++ 库 classes 都是前向声明的。包含一些随机头文件可能会让您获得 std::ostream
的前向声明,作为免费奖励。所以编译器不会抱怨这个 class not being defined.
但是除非包含 <iostream>
,否则编译器将不知道那里定义的所有重载。就是这样。
为了获得乐趣和体验,我正在 修改和 探索 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 行)错误消息:
error: no match for ‘operator<<’ (operand types are ‘std::ostream {aka std::basic_ostream}’ and ‘const char [32]’)
return stream << val.name << " (" << val.hostname << ":" << val.port << ")";
我将代码简化为:
std::ostream& operator<<(std::ostream& stream, const ServerInfo& val) {
stream << "hello"; //can't get simpler than this, right?
return stream;
}
得到了
error: no match for ‘operator<<’ (operand types are ‘std::ostream {aka std::basic_ostream}’ and ‘const char [6]’)
stream << "hello";
调用它的代码如下所示:
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: 这是请求的 headers:
/* header include */
#include "NetworkMessage.h"
/* includes */
#include <cstring>
#include "UserConfig.h"
#include "SpeedController.h"
PPS: 如果您想知道为什么我没有收到关于 std::ostream
的错误未定义,请查看 Sam 回答的第 3 段。
#include <iostream>
可能丢失的事实是使用夏洛克·福尔摩斯的调试方法推断出来的:"when you have eliminated the impossible, whatever remains, however improbable, must be the truth"。
很明显。 std::ostream
接受 const char *
过载应该没有问题。
因此,超载解决方案投诉必须意味着 <iostream>
未包含在内。大多数 C++ 库 classes 都是前向声明的。包含一些随机头文件可能会让您获得 std::ostream
的前向声明,作为免费奖励。所以编译器不会抱怨这个 class not being defined.
但是除非包含 <iostream>
,否则编译器将不知道那里定义的所有重载。就是这样。