【问题标题】:How do I include two different headers that contain two different classes that have the same name?如何包含两个不同的标题,其中包含两个具有相同名称的不同类?
【发布时间】:2011-04-20 07:07:45
【问题描述】:

我正在对旧的 MFC 应用程序进行一些更改。头文件“stdafx.h”包括另一个头文件“mfcextensions.h”,它定义了一个类“CMemDC”。在另一个标题中,我需要包含“afxtoolbar.h”,以便可以使用“CMFCToolBar”类。问题是,“afxtoolbar.h”最终将包含“memdc.h”,它定义了一个类“CmemDC”。结果是可以理解地得到 2011 的编译错误。

现在我确实可以控制我们现有的定义“CMemDC”的代码,但这在很多地方都有使用,所以我不想做太多改动。

克服这种情况的最佳策略是什么?我猜我可以以某种方式使用命名空间,或者另一种选择是重命名我们现有的类“CMemDC”,但这更多的是避免问题而不是解决问题。

干杯

【问题讨论】:

  • 命名空间是名称冲突的解决方案(重命名除外)。

标签: visual-studio-2010 visual-c++ mfc mfc-feature-pack


【解决方案1】:

使用命名空间是正确的途径,但您可能还想看看为什么在整个应用程序中声明 CMemDC。除非您真的需要在任何地方声明您的 CMemDC,否则您可能能够从 stdafx.h 中删除包含并仅包含在真正需要它的 cpp 文件中。

【讨论】:

  • 我过度简化了问题,“mfcextensions.h”包括一大堆其他最终包括“memdc.h”的问题。我开始走这条路,因为它可能是最简单的解决方案,但有很多地方使用它。我想我会用 CMemDC 修改库并将其添加到命名空间
【解决方案2】:

C++ 命名空间可能会对您有所帮助。将至少一个 CMemDC 类放在合适的命名空间中,并在您希望使用每个类的地方使用它们的完全限定名称。

您可以避免使用完全限定名称,并在当前范围内使用全局命名空间

using namespace yournamespacename;

但是,这不太明确(就无法直接查看您在代码中的某一点使用哪个 CMemDC 而言),如果您在同一范围内使用这两个类,这将不起作用。

【讨论】:

    【解决方案3】:

    如果您有 2 个具有相同名称的类,则最好的选择是使用命名空间。您也可以重命名您的课程。但是所有这些都已经在您的帖子中了。所以你自己回答了问题。没有什么魔法可以帮助您,因为您一直遇到名称冲突的常见问题,并且引入了命名空间来解决此类问题。

    【讨论】:

      猜你喜欢
      • 2020-03-30
      • 1970-01-01
      • 2018-12-21
      • 2013-07-08
      • 2014-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多