0

大家好

我是 C++ 的新手,对 Borland Turbo C++ Explorer 更是如此。我刚刚遇到了这个编译错误。关于如何修复它的任何线索?

[C++ Error] comsvcs.h(3209): E2015 Ambiguity between 'ITransaction' and 'Oledb::ITransaction'
[C++ Error] comsvcs.h(3275): E2015 Ambiguity between 'ITransaction' and 'Oledb::ITransaction'
[C++ Error] comsvcs.h(16197): E2015 Ambiguity between 'ITransaction' and 'Oledb::ITransaction'
[C++ Error] comsvcs.h(16293): E2015 Ambiguity between 'ITransaction' and 'Oledb::ITransaction'

第一个出现的代码是

EXTERN_C const IID IID_ICreateWithTransactionEx;

#if defined(__cplusplus) && !defined(CINTERFACE)

    MIDL_INTERFACE("455ACF57-5345-11d2-99CF-00C04F797BC9")
    ICreateWithTransactionEx : public IUnknown
    {
    public:
    virtual /* [helpstring][helpcontext] */ HRESULT STDMETHODCALLTYPE CreateInstance(
        /* [in] */ ITransaction *pTransaction,
        /* [in] */ REFCLSID rclsid,
        /* [in] */ REFIID riid,
        /* [iid_is][retval][out] */ void **pObject) = 0;

    };

来自另一个来源的一些建议:

正如编译器的错误消息所说,在编译单元的范围内有 2 个 ITransaction 数据类型的声明。似乎 ITransaction 定义来自 Microsoft 的 comsvc​​s.h,而 OleDB::ITransaction 是 Borland 的 ITransaction 接口的实现。所以你可以尝试两件事:

  1. 消除 OleDB::ITransaction 定义(不知道 Turbo C++,但可能有一个组件处理 oleDB。尝试摆脱它。或者它可能通过使用另一个#include 来包含。搜索文本 oledb:: ITransaction 在您的包含目录中,您将有望找到相关文件。修改包含路径,使其不再包含)。
  2. 您可以尝试定义 CINTERFACE 因为如果定义了导致编译错误的代码将不包括在内。但这可能会导致其他问题...

有没有人有任何其他建议?

亲切的问候,布鲁斯。

4

2 回答 2

0

我不知道如何做 COM 或你的 ITransaction 是什么,但在我看来你的范围包含两种 ITransaction 类型。你能在你的函数原型中更明确吗?您可以确定要使用的 ITransaction 的范围吗?说“::ITransaction”(使用全局命名空间)还是“some_other_namespace::ITransaction”?

于 2008-11-13T07:11:28.413 回答
0

好的,我们需要以某种方式结束这个问题。在使用最新补丁更新 Turbo C++ Explorer 后,问题就消失了。

感谢一路上提供建议的所有人。

于 2008-11-16T08:45:26.907 回答