【问题标题】:Name conflict in forward declaration [duplicate]前向声明中的名称冲突[重复]
【发布时间】:2019-02-15 05:47:56
【问题描述】:

我在标题中声明了一个TMultiReadExclusiveWriteSynchronizer 类型的指针。为此,我想使用前向声明

class TMultiReadExclusiveWriteSynchronizer;

因为描述此类的vcl.h 库已经包含在cpp 文件中。

但是如果我像下面的例子那样做,我会得到一个错误:

模糊的名字

因为编译器在我的前向声明和System::Sysutils::TMultiReadExclusiveWriteSynchronizer(这是vcl.h 的一部分)中找到了名称TMultiReadExclusiveWriteSynchronizer

如果没有我的前向声明,编译器会告诉我这种类型是未知的。 我不明白,为什么当我不使用前向声明时编译器找不到TMultiReadExclusiveWriteSynchronizer 类,但如果我使用一个,那么编译器就会出现名称冲突。

它怎么能在System::Sysutils::TMultiReadExclusiveWriteSynchronizer 中找到名字呢?这不包含在我的标题中。就像在下面的示例中一样,我的 hpp 文件没有包含。

我该如何解决这个问题?

当然,我可以在我的标题中包含System::Sysutils,或者更改我的cpp 中包含的顺序。但是我不想包含一些东西,我只需要一个简单的前向声明。

文件.hpp

class TMultiReadExclusiveWriteSynchronizer;

....

TMultiReadExclusiveWriteSynchronizer* sync;

文件.cpp

#include "file.hpp"
#include <vcl.h>

....

【问题讨论】:

  • 需要在同一个命名空间中转发声明。
  • 感谢您的帮助。对不起,但我不明白你的意思。你能用这个例子给我解释一下吗?
  • 我看不到,我如何在不同的命名空间中。
  • 仅供参考,TMREWSync typedef 可用于TMultiReadExclusiveWriteSynchronizer
  • "它怎么能在System::Sysutils::TMultiReadExclusiveWriteSynchronizer 中找到名字?这不包含在我的标题中。就像在下面的示例中,我的 hpp 文件没有包含" -因为编译器不是在编译 HPP 文件本身,而是在编译 CPP 文件。所以它首先包含你的HPP并解析它,然后它包含vcl.h并解析它,其中包括System.SysUtils.hpp(以及其他)。

标签: c++ c++11 c++builder forward-declaration


【解决方案1】:

file.hpp 中,前向声明应该是:

namespace System {
    namespace Sysutils {
         class TMultiReadExclusiveWriteSynchronizer;
    }
}

可能所有对该类型的引用(至少在头文件中)都应该有 完全限定名称System::Sysutils::TMultiReadExclusiveWriteSynchronizer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 2013-12-08
    • 2023-03-21
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    相关资源
    最近更新 更多