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

时间:2018-09-12 22:19:23

标签: c++ namespaces

我刚开始学习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;
}

我不知道为什么无法打印出无效的pp()。

有人能让我知道为什么会发生吗?

1 个答案:

答案 0 :(得分:0)

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

#include <iostream>
void pp()
{
}

int main()
{
    std::cout << pp();
}

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

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

由于编写一个不输出任何内容的输出函数实际上是在浪费程序员时间,因此没有人认为可以指定标准库实现者必须实现处理operator<<的{​​{1}}。正如贾斯汀在下面的注释中所指出的,您不能将void用作函数参数,因为类型void的变量无法实例化。这不仅浪费时间,而且是不可能的。

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

对于标准库容器,没有一致的默认方式应该输出容器,因此库容器没有内置的<<重载。第一次尝试打印<<时通常会感到震惊。