大家好

我是 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,因为如果定义了 CINTERFACE,则不会包含导致编译错误的代码。但这可能会导致其他问题......

有人还有其他建议吗?

亲切问候 布鲁斯。

有帮助吗?

解决方案

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

其他提示

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top