我们已经编写了一个智能指针类,并且已经使用内置的Visual Studio STL实现取得了巨大的成功。
问题是我们已经意识到我们的性能瓶颈存在于从Linux移植的代码中的STL库中(STL在我们使用它的方式上要快得多)。所以我试图在STLPort中链接,看它是否处理我们的性能问题。
使用STLPort 5.2.1但是我得到了与ambigous copy构造函数相关的非常奇怪的构建错误。我把它剥离到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>
]
我有点被困在如何继续这里,任何人都知道这个是怎么回事?
答案 0 :(得分:1)
实际上你的operator&
引起了歧义。在g ++中,歧义是破坏而不是构造,但我认为这是一个类似的问题。
编译器尝试获取T的地址来构造/破坏它,然后返回T**
而不是CRefCountPtr<T>*
,从而导致混淆。
我打赌你可以创建自己的特定分配器,知道如何处理这个(也就是非模板)并让它进行编译。
可能更好的长期是摆脱operator&
因为它只会引起混淆。