为什么使用未知类型名称“ Complejo”?

时间:2019-08-30 11:35:08

标签: c++ c++11

这是一个简单的例子。

示例1 例如,如果我声明此代码(在同一文件中带有Complejo类):

#include <iostream>
#include <string>

using namespace std;

int main()
{
  Complejo com(1,1);

  cout << com << endl;

}


class Complejo
{
private:
  double real;
  double imaginario;
public:
  //Complejo();
  Complejo(double real, double imaginario)
  {
    real = 1;
    imaginario = 2;
  }
  double getReal() { return real; }
  double getImaginario() { return imaginario; }
};

ostream &operator<<(ostream &stream, Complejo& comp)
{
  stream << comp.getReal() << " + " << comp.getReal()<< endl;
  return stream;
}

我的编译器说:

  

sobrecarga_ostream.cpp:15:3:错误:未知类型名称'Complejo'

示例2 但是,如果我创建sobrecarga_ostream.cpp:

#include <iostream>
#include <string>
#include "Complejo.h"
using namespace std;

int main()
{    
  Complejo com(1,1);


  cout << com << endl;

}

和Complejo.h:

#include <iostream>

using namespace std;

class Complejo
{
private:
  double real;
  double imaginario;
public:
  //Complejo();
  Complejo(double real, double imaginario)
  {
    real = 1;
    imaginario = 2;
  }
  double getReal() { return real; }
  double getImaginario() { return imaginario; }
};

ostream &operator<<(ostream &stream, Complejo& comp)
{
  stream << comp.getReal() << " + " << comp.getReal()<< endl;
  return stream;
}

然后,它运行良好。

为什么“ main + class”不能在同一个文件中工作,而如果我分开文件则可以工作?

谢谢!

2 个答案:

答案 0 :(得分:4)

在声明类型之前不能使用它。如果您将第一个示例重新排列为

using namespace std;

class Complejo {
    //...
};

int main()
{
  Complejo com(1,1);

  cout << com << endl;

}

它将合规。请注意,#include所做的只是将标头的内容包含到源文件中。因此,示例2与上述示例大致相同。

PS:请阅读why is using namespace std considered bad practice

答案 1 :(得分:2)

  

为什么“ main + class”在同一文件中不起作用

因为编译器看到了这一行

Complejo com(1,1);

在您的main函数中,需要预先查看类型Complejo的定义。没办法解决-将它放到头文件中并包含它,还是从类顶部的main函数下面剪切并粘贴类定义都没有关系,两种方法都可以。 / p>