【问题标题】:in constructor 'cout' was not declared in this scope在此范围内未声明构造函数“cout”
【发布时间】:2018-05-29 01:00:08
【问题描述】:

我想练习一些基本的 C++ 东西。我专注于继承只是为了试验它。一切都很顺利,直到我遇到一些奇怪的问题:'cout' 没有在这个范围内声明。我查看了一些主题,但大多数主题的提示都类似于附加库或编写“使用命名空间 std”,但这并不能解决我的问题。

#include <iostream>

class podst
{
public:
    float a;
    float b;
    float dodaw();
    podst(float c,float d) : a(c), b(d)
    {

    }
};
float podst::dodaw()
{
    return (a+b);
}

class poch : public podst
{
    poch() : podst(5,4)
    {
       cout << a << endl << b << dodaw() << endl;
    }

};


using namespace std;
int main()
{
    podst podst(1,2);
    cout <<  podst.dodaw() << endl;
    poch poch2;

    return 0;


}

【问题讨论】:

标签: c++ inheritance scope cout


【解决方案1】:

poch 从全局命名空间调用 cout,而不是从 std 命名空间。请注意,using namespace std; 指令实际上位于它的下方,而不是上方。如果您不想每次都编写整个命名空间前缀,那么最好将该指令放在每个函数的基础上,而不是每个文件的基础上:

poch() : podst(5,4)
{
   using namespace std;
   cout << a << endl << b << dodaw() << endl;
}

这种方法将有助于保持大型代码库的整体性。

【讨论】:

  • 我很好奇您为什么在构造函数正文中选择 using namespace std; 作为您建议的解决方案。
  • @FrançoisAndrieux 我建议在每个功能的基础上使用该指令,仅此而已。
【解决方案2】:

第一次使用 cout 时 using 命名空间 std 在下方。 尝试在 poch 类中使用 std::cout 和 std::endl。

【讨论】:

  • +1。而且,更好的是,不要使用std::endl,而是使用'\n'。此代码不需要 std::endl 所做的额外内容。
【解决方案3】:

using 声明在您编写它的地方开始生效。由于对cout 的调用高于该点,因此using 并未涵盖它,因此您必须在此处拼出std::cout

You should avoid using namespace std。一个更好的选择是只提取你需要的东西,例如与using std::cout;。但更好的选择是只使用限定名称。打字有点多,但它可以防止歧义;并且限定名称在我所见过的每个代码库中都如此普遍,至少对我而言,像cout 这样的不限定名称总是有点令人惊讶,并且在阅读代码时让我有点不适应。

【讨论】:

    【解决方案4】:

    因为 poch 是一个继承自父类的类,所以你需要 在文件开头声明标准命名空间以使其对所有类和函数都是全局的,但是您在 main 之前声明了它,因此 poch 类无法使用它,而是您可以显式使用 std::cout 和 std ::endl 并且程序编译不会有问题。

    【讨论】:

    • 我已建议删除您的其他答案。如果您有更多内容要添加,请使用“编辑”按钮来编辑现有答案并对其进行改进,而不是为单个问题创建多个答案。
    【解决方案5】:
    class poch : public podst
    {
        poch() : podst(5,4)
        {
           //you should have used std::cout
           std::cout << a << endl << b << dodaw() << std::endl;
        }
    
    };
    

    【讨论】:

    • 请将此答案删除/移动到您的其他答案中。
    【解决方案6】:

    如果你想省略标准库命名空间调用者::std,你应该写

    using namespace std;
    

    之前(通常写在 #include 语句之后和 int main() 之前)"

    cout << ...
    

    编译器按顺序读取代码。请注意,使用“使用”被认为是不好的做法。我建议习惯像这样使用 std:: 命名空间调用者:

    std::cout << "Hello World!" << std::endl;
    

    解决您的具体问题:

    #include <iostream>
    
    using namespace std;
    
    class podst { ...
    

    【讨论】:

      猜你喜欢
      • 2013-02-17
      • 1970-01-01
      • 2016-01-23
      • 2020-11-25
      • 2015-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多