前向声明中的名称冲突[重复]

问题描述 投票:-1回答:1

这个问题在这里已有答案:

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

class TMultiReadExclusiveWriteSynchronizer;

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

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

暧昧的名字

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

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

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

我该如何解决这个问题?

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

file.hpp

class TMultiReadExclusiveWriteSynchronizer;

....

TMultiReadExclusiveWriteSynchronizer* sync;

file.cpp

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

....
c++ c++11 c++builder forward-declaration
1个回答
1
投票

file.hpp,前瞻性声明应该是:

namespace System {
    namespace Sysutils {
         class TMultiReadExclusiveWriteSynchronizer;
    }
}

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

© www.soinside.com 2019 - 2024. All rights reserved.