gpt4 book ai didi

c++ - 具有智能指针类的 VS2008 中的 STLPort 模糊复制构造函数

转载 作者:太空宇宙 更新时间:2023-11-04 12:20:11 25 4
gpt4 key购买 nike

我们编写了一个智能指针类,并在内置的 Visual Studio STL 实现中使用它并取得了巨大成功。

问题是我们已经意识到我们的性能瓶颈在从 Linux 移植的代码中的 STL 库中(STL 比我们使用它的方式快得多)。所以我尝试在 STLPort 中进行链接,看看它是否能解决我们的性能问题。

然而,当使用 STLPort 5.2.1 时,我遇到了与模棱两可的复制构造函数相关的非常奇怪的构建错误。我已将其精简为 50 行 C++ 程序

#include "stdafx.h"
#include <set>

using namespace std;

template<class T>
class CRefCountPtr
{
public:
CRefCountPtr(T* pT) : m_T(pT)
{
}

T** operator&()
{
return &m_T;
}

operator T*() const
{
return (T*)m_T;
}

bool operator< (T* pT) const
{
return m_T < pT;
}

T* m_T;
};

class Example
{
int example;
};


int _tmain(int argc, _TCHAR* argv[])
{

set< CRefCountPtr<Example> > blah;
Example ex;
blah.insert(&ex);

return 0;
}

我从 VS2008SP1 得到的错误是

stlport\stl\_tree.h(318) : error C2782: 'void stlp_std::_Copy_Construct(_Tp *,const _Tp &)' : template parameter '_Tp' is ambiguous
stlport\stl\_construct.h(130) : see declaration of 'stlp_std::_Copy_Construct'
could be 'CRefCountPtr<T>'
with
[
T=Example
]
or 'Example *'
.....
stlport_example.cpp(43) : see reference to class template instantiation 'stlp_std::set<_Key>' being compiled
with
[
_Key=CRefCountPtr<Example>
]

我有点不知道如何继续这里,有人知道这个是怎么回事吗?

最佳答案

其实是你的operator&这造成了歧义。在 g++ 中,歧义在于破坏而不是构造,但我认为这是一个类似的问题。

编译器尝试获取您的 T 的地址来构造/破坏它,并返回一个 T**而不是 CRefCountPtr<T>* ,造成困惑。

我打赌你可以创建自己的特定分配器,它知道如何处理这个(也不是模板)并让它编译。<​​/p>

从长远来看,可能更好的方法是摆脱 operator&因为它只会引起困惑。

关于c++ - 具有智能指针类的 VS2008 中的 STLPort 模糊复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5517799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com