【问题标题】:Cannot include .cpp and .h files不能包含 .cpp 和 .h 文件
【发布时间】:2022-11-27 11:01:43
【问题描述】:

我创建了一个 Dialog 类并将其分成 .cpp 和 .h。 我的 cpp 文件如下所示:

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

namespace Model1
{
    void Dialog::initialize ()
    {
          cout << "initialization";
    }
}

这是我的 h 文件:

using namespace std;
class Dialog
    {
        public:
            void initialize ();
    };

当我在 visual studio 2022 中调试代码时,我得到以下信息:

cannot open source file "Dialog.h"
name followed by '::' must be a class or namespace name
Cannot open include file: 'Dialog.h': No such file or directory ConsoleApplication1 
symbol cannot be defined within namespace 'Model1'  ConsoleApplication1

当我将头文件更改为

using namespace std;
namespace Model1 {
    class Dialog
    {
    public:
        void initialize();
    };
}

现在我有这些错误:

cannot open source file "Dialog.h"
name followed by '::' must be a class or namespace name
Cannot open include file: 'Dialog.h': No such file or directory 

我该如何解决这个问题?

【问题讨论】:

  • 类的成员函数的类外定义必须在包含类所在的同一个命名空间中。但是您的代码的问题在于,在头文件中,您在全局命名空间中定义了 Dialog 类,而您试图在 Model1 命名空间中定义成员函数 Dialog::initialize()。有2种解决方法正如我在下面的answer 中所解释的那样。

标签: c++ include


【解决方案1】:

问题是在头文件中你定义了类Dialog全局命名空间当您尝试在 Model1 命名空间中定义成员函数 Dialog::initialize() 时。

这是行不通的,因为类的成员函数的类外定义必须在包含类的同一个命名空间中.

因此,要解决此问题,您可以在命名空间 Model1 中定义类(在标头中)或在全局命名空间中实现成员函数(在源文件中)。这两种方法如下所示:

方法一

这里我们在header中定义命名空间Model1中的类,并留下源文件不变.

对话框.h

namespace Model1   //added this namepspace here
{
class Dialog
    {
        public:
            void initialize ();
    };
}

Working demo 1


方法二

这里我们在源文件中定义全局命名空间中的成员函数,并留下头文件不变.

对话框.cpp

#include "Dialog.h"
void Dialog::initialize ()
{
      cout << "initialization";
}

Working demo 2

【讨论】:

  • 我了解到类的成员函数的类外定义必须在包含类所在的同一名称空间中。美丽的。 +1
  • @RohanBari 不客气:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多