C++命名空间中调用 void 函数的错误

C++ error to call void function in namespace

本文关键字:函数 错误 void 调用 命名空间 C++      更新时间:2023-10-16

我刚开始学习c ++,在练习时遇到了错误。我正在练习使用命名空间和cin,cout。

我试图通过每个输入打印出每个命名空间的功能。下面是我写的代码:

#include "iostream"
using namespace std;
namespace ns1
{
int pp()
{
int x = 1;
for (int i = 0; i < 9; i++)
{
cout << x << endl;
x++;
}
return 0;
}
}
namespace ns2
{
void pp()
{
double x = 2;
while (x < 6)
{
cout << x << endl;
x += 1.7;
}
}
}
int main()
{
bool check = 0;
cout << "Type 0 or 1 then you will have the following answer" << endl;
cin >> check;
if (check == 0)
{
cout << ns1::pp() << endl;
}
else
{
cout << ns2::pp() << endl;
}
return 0;
}

我不知道为什么 void pp(( 不能打印出来。

谁能告诉我为什么会这样?

首先,让我们将问题简化为 MCVE,并从程序中消除尽可能多的噪音。

#include <iostream>
void pp()
{
}
int main()
{
std::cout << pp();
}

这会产生完全相同的错误,没有命名空间或其他干扰。

问题的症结在于pp从函数返回void,即什么都没有。由于不返回任何内容,因此没有要输出的内容。

因为编写一个不输出任何内容的输出函数本质上是浪费程序员的时间,所以没有人认为指定标准库实现者必须实现处理voidoperator<<合适。正如 Justin 在下面的评论中指出的那样,您不能将void用作函数参数,因为无法实例化void类型的变量。这使得它不仅浪费时间,而且是不可能的。

您会发现自定义类会遇到类似的问题。除非有人花时间为类编写<<重载,否则无法打印该类,除非可以先将其转换为可打印的类或数据类型。

对于标准库容器,没有商定的默认输出容器方式,因此库容器没有内置<<重载。当您第一次尝试打印std::vector时,这通常会令人震惊。