求 Ambiguity between 'Windows' and 'Excel_2k::Windows' 的解决方法

slys_123 2009-09-17 06:12:15
加精
编译的时候出现一堆的错误:
[C++ Error] olectrls.hpp(107): E2015 Ambiguity between 'Windows' and 'Word_2k::Windows'
[C++ Error] SyncObjs.hpp(75): E2015 Ambiguity between 'Windows' and 'Excel_2k::Windows'
[C++ Error] ExtDlgs.hpp(32): E2015 Ambiguity between 'Dialogs' and 'Excel_2k::Dialogs'
[C++ Error] ExtDlgs.hpp(34): E2015 Ambiguity between 'Dialogs' and 'Excel_2k::Dialogs'
[C++ Error] ExtDlgs.hpp(39): E2015 Ambiguity between 'Buttons' and 'Excel_2k::Buttons'
[C++ Error] sbs.cpp(78): E2277 Lvalue required
.......


sbs.cpp包含头文件如下:
----------------------------------
#include <vcl.h>
#pragma hdrstop
#include "share.h"
#include "sbs.h"
#pragma package(smart_init)
#pragma link "Excel_2K_SRVR"
#pragma resource "*.dfm"
......
---------------------------------

sbs.h包含头文件如下:
----------------------------------
#ifndef B_sbsjcxH
#define B_sbsjcxH
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Buttons.hpp>
#include <Grids.hpp>
#include <Dialogs.hpp>
#include <OleServer.hpp>
#include <ComCtrls.hpp>
#include <ExtCtrls.hpp>
#include "Excel_2K_SRVR.h"
-----------------------------------


share.h 包含头文件如下
-----------------------------------
#ifndef B_shareH
#define B_shareH
#include <SysUtils.hpp>
#include <Grids.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <DBGrids.hpp>
#include <Dialogs.hpp>
#include <OleServer.hpp>
#include <Chart.hpp>
#include <utilcls.h>
#include <Word_2k.h>
#include <Word_2K_SRVR.h>
#include <Excel_2K_SRVR.h>
------------------------------------


调整#include "Excel_2K_SRVR.h"的位置的确有效果,但是现在sbs.cpp中同时包含了
share.h 和 sbs.h ,而share.h 和 sbs.h 中又都包含有Excel_2K_SRVR.h ,调顺序已经没有用了!!

哪位有办法解决,分全给!!今晚在线等!
...全文
2199 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
jonnyhe 2010-02-24
  • 打赏
  • 举报
回复
高手。。。哈哈,我也解决了。。
w88529593 2009-10-22
  • 打赏
  • 举报
回复
以前碰到这个问题,就是前面加上命名空间,没想到还有这么一招,学走了,呵呵
fang5984827 2009-09-20
  • 打赏
  • 举报
回复
问题解决啦,用的还是老办法——调整头文件包含的顺序。不过有一点技巧。
nbaertuo 2009-09-19
  • 打赏
  • 举报
回复
dddddddddd
csshrb2004 2009-09-19
  • 打赏
  • 举报
回复
好东西啊
slys_123 2009-09-18
  • 打赏
  • 举报
回复
utin431你可能没遇到过这种情况,我对sbs.cpp进行编译,报错的不是sbs.cpp而是BCB的库文件如:

[C++ Error] DBCtrls.hpp(1075): E2015 Ambiguity between 'Buttons' and 'Excel_2k::Buttons'

而DBCtrls.hpp中1075行是这样的:
class PASCALIMPLEMENTATION TNavButton : public Buttons::TSpeedButton

而在Excel_2K_SRVR.h中有这样的定义:
...
#include "Excel_2k.h"
namespace Excel_2k
{
...
LPDISPATCH __fastcall Buttons(VARIANT Index/*[in,opt]*/, long lcid/*[in]*/)
{
return GetDefaultInterface()->Buttons(Index/*[in,opt]*/, lcid/*[in]*/);
}
...
}

在Excel_2k.h中有这样的定义:
namespace Excel_2k
{
interface DECLSPEC_UUID("{0002087E-0000-0000-C000-000000000046}") Buttons;
typedef TComInterface<Buttons, &DIID_Buttons> ButtonsPtr;
...
}

从报错的语句及Excel_2k命名空间的定义上看,在DBCtrls.hpp行1075中的“Buttons”是一个命名空间,而在Excel_2k命名空间中从头到脚都没有把“Buttons”定义为命名空间,我就纳闷BCB怎么会连命名空间和类、接口都分不清呢,或者把它们同等看待了呢!


总之感谢你们的热心帮助,也希望有解决这个问题的经验的朋友加入讨论,如果我找到了合适的解决方法就一
定公布在这!
ccrun.com 2009-09-18
  • 打赏
  • 举报
回复
遇到这个问题的朋友可能比较多,推荐一下。
slys_123 2009-09-18
  • 打赏
  • 举报
回复
问题解决啦,用的还是老办法——调整头文件包含的顺序。不过有一点技巧。

是这样的,BCB在加载头文件的时候把当前头文件包含的头文件也展开,如果这些头文件在前面已经加载过,那么这个头文件就不会再次被加载,所以根据这个原理我把与Excel_2K_SRVR.h、Word_2k.h或Word_2K_SRVR.h存在冲突的BCB库文件如olectrls.hpp、SyncObjs.hpp、ExtDlgs.hpp及DBCtrls.hpp等添加到share.h中的“#include <Word_2k.h>”语句的前面,而在sbs.cpp中保证#include "share.h" 在其它include 语句的前面,下面我演示一下sbs.cpp中头文件包含的顺序:
(注意颜色的对应)

sbs.cpp包含头文件如下:
----------------------------------
#include <vcl.h>
#pragma hdrstop
#include "share.h"
#include "sbs.h"
...
#pragma package(smart_init)
#pragma link "Excel_2K_SRVR"
#pragma resource "*.dfm"
......
---------------------------------



share.h 包含头文件如下
-----------------------------------
#ifndef B_shareH
#define B_shareH
#include <SysUtils.hpp>
#include <Grids.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <DBGrids.hpp>
#include <Dialogs.hpp>
#include <OleServer.hpp>
#include <Chart.hpp>
#include <utilcls.h>
#include <ComCtrls.hpp>
#include <olectrls.hpp>
#include <DBCtrls.hpp>
#include <SyncObjs.hpp>
#include <ExtDlgs.hpp>
#include <Word_2k.h>
#include <Word_2K_SRVR.h>
#include <Excel_2K_SRVR.h>

------------------------------------


sbs.h包含头文件如下:
----------------------------------

#ifndef B_sbsjcxH
#define B_sbsjcxH
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Buttons.hpp>
#include <Grids.hpp>
#include <Dialogs.hpp>
#include <OleServer.hpp>
#include <ComCtrls.hpp>
#include <ExtCtrls.hpp>
#include "Excel_2K_SRVR.h"

-----------------------------------


现在对sbs.cpp进行编译,那么对sbs.cpp中的包含的头文件进行展开:

第一步全部展开,则sbs.cpp中包含头文件如下:
-------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "share.h"
#include <SysUtils.hpp>
#include <Grids.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <DBGrids.hpp>
#include <Dialogs.hpp>
#include <OleServer.hpp>
#include <Chart.hpp>
#include <utilcls.h>
#include <ComCtrls.hpp>
#include <olectrls.hpp>
#include <DBCtrls.hpp>
#include <SyncObjs.hpp>
#include <ExtDlgs.hpp>
#include <Word_2k.h>
#include <Word_2K_SRVR.h>
#include <Excel_2K_SRVR.h>


#include "sbs.h"
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Buttons.hpp>
#include <Grids.hpp>
#include <Dialogs.hpp>
#include <OleServer.hpp>
#include <ComCtrls.hpp>
#include <ExtCtrls.hpp>
#include "Excel_2K_SRVR.h"

...
#pragma package(smart_init)
#pragma link "Excel_2K_SRVR"
#pragma resource "*.dfm"
......
-----------------------------------------------------------


第二步根据加载原理去除后面中重复的项,则
sbs.cpp中包含头文件如下:
----------------------
#include <vcl.h>
#pragma hdrstop

#include "share.h" //该头文件中自身定义的东西保留
#include <SysUtils.hpp>
#include <Grids.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <DBGrids.hpp>
#include <Dialogs.hpp>
#include <OleServer.hpp>
#include <Chart.hpp>
#include <utilcls.h>
#include <ComCtrls.hpp>
#include <olectrls.hpp>
#include <DBCtrls.hpp>
#include <SyncObjs.hpp>
#include <ExtDlgs.hpp>
#include <Word_2k.h>
#include <Word_2K_SRVR.h>
#include <Excel_2K_SRVR.h>


#include "sbs.h" //该头文件中自身定义的东西保留
#include <Forms.hpp>
#include <Buttons.hpp>
#include <ExtCtrls.hpp>

...
#pragma package(smart_init)
#pragma link "Excel_2K_SRVR"
#pragma resource "*.dfm"
......
-----------------------------------------------------------


就这么简单,所有与Excel_2K_SRVR.h冲突的BCB库文件都跑到它的前面去了!
同理如果在编译过程中还有BCB库文件与Excel_2K_SRVR.h冲突,则把该库文件include到share.h中去,前提是被编译的文件包含share.h并在其它include语句的前面!这样也达到了一改全改的目的!


最后请原谅我在发表这个问题时没有指明sbs.cpp中还包含有其它头文件,而这些头文件可能也包含Excel_2K_SRVR.h ,因为这些头文件太多了,层层展开真的很恐怖!


现在好了,可以结帖了!感谢keiy和utin431,你们辛苦啦,散分!
这个周未可以出去晒阳光啦....
utin431 2009-09-17
  • 打赏
  • 举报
回复
命名空间的问题,不同命名空间中有重名的方法或属性,系统编译时无法确定该使用哪个中的。

LZ根据使用的方法或属性的命名空间情况,在用到的属性或方法前面加上system::function或Word_2K::function试试看,你用哪个空间的调用,前面就加上哪个空间的命名。

确切的空间名称你查看下头文件.hpp。

以上不一定正确,但可以参考。
slys_123 2009-09-17
  • 打赏
  • 举报
回复
实际上我只是编译程序中的一个单元文件,还有几十个这样的单元文件,太麻烦了,我在这里也是想先验证一下!程序是公司的,我也不好公开!
柯本 2009-09-17
  • 打赏
  • 举报
回复
bcb应该没有设置强制使用默认命名空间的选项,虽然可用using namespace设定缺省的命名空间,但无法强制设定,何况一般不可能去修改系统本身的.h文件。
google上也有多个同样的问题,解决方案都是调整.h的位置,以前我也是用同样的方法。
实在不行你可将你的程序发mail到我的keiy2k@163.com,我帮你看看
slys_123 2009-09-17
  • 打赏
  • 举报
回复
我这还是不行,不过真的太感谢你了!

好像是不是在工程的什么地方可以设置强制使用默认命名空间什么的!我没找到,

这样子改实在太麻烦了,我是从一个较大的MID系统上摘下来的,他原来应该 是可以直接编译的!

搞了两天都没搞定,希望明天继续!
柯本 2009-09-17
  • 打赏
  • 举报
回复
我又重新试一下,我上面的是有问题.按你原来的调证试试
1.将sbs.cpp中的#include "share.h" 放在#include "sbs.h" 之后
2.将share.h 中的#include <Word_2k.h> 放在
#include <Word_2K_SRVR.h>
#include <Excel_2K_SRVR.h>
之后
我测试了一下程序,基本按你的模式,可以了
slys_123 2009-09-17
  • 打赏
  • 举报
回复
不行啊,因为sbs窗体上有个TExcelApplication(excel控件),所以在sbs.h上删除了#include "Excel_2K_SRVR.h" 就算在sbs.cpp中加入#include "Excel_2K_SRVR.h",在保存时被删除的东西又自动添加进去了。

另外share.h上虽然没有自动添加删除的信息,但是因为它上面有个声明:
void __fastcall F_dbgridSave(TDBGrid *DBGrid1,TSaveDialog *SaveDialog1,
TExcelApplication *ExcelApplication1);
所以编译的时候就报错:
share.h(62): E2303 Type name expected
柯本 2009-09-17
  • 打赏
  • 举报
回复
我以前也遇到类似的问题,解决方法:
不要将#include "Excel_2K_SRVR.h" 等放在.h文件中,放入你的.cpp中,具体做法:
1.在你的sbs.cpp
#pragma package(smart_init)
之前加
#include "Excel_2K_SRVR.h"
并将sbs.h中的#include "Excel_2K_SRVR.h"删除
2.同样在你的shere.cpp
#pragma package(smart_init)
之前加
#include <Word_2K_SRVR.h>
#include <Excel_2K_SRVR.h>
#include <Word_2k.h> //注意,这个一定要放最后
然后在你的shere.h中删除该3项

你试一下,应该没问题的

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧