gpt4 book ai didi

c++ - 帮助在 std::map 中存储模板类的 intrusive_ptr

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:06:19 31 4
gpt4 key购买 nike

我在 boost::intrusive_ptr 中包含一个 Locker 类型的小模板类,我想将其存储在 std::map 中:

template <typename T>
bool LockerManager<T>::
AddData(const std::string& id, T* pData)
{

boost::intrusive_ptr<Locker<T> > lPtr(Locker<T>(pData)); // Line 359 - compiles

mMap.insert(make_pair(id, lPtr)); // Line 361 - gives error
}

Locker只是一个容器类;它的构造函数看起来像:

template <typename T>
Locker<T>::
Locker(T* pData)
: IntrusivePtrCountable(),
mpData(pData),
mThreadId(0),
mDataRefCount(0)
{}

在我对这门课的测试中,我试图做以下事情:

class Clayton
{
public:
static int count;

Clayton()
{ mNumber = count++;}

void GetNumber()
{ cerr<<"My number is: "<<mNumber<<endl; }

private:
int mNumber;
};

int Clayton::count = 0;

class ClaytonManager
{
public:
bool AddData(const std::string& id, Clayton* pData)
{ return mManager.AddData(id, pData); }

private:
LockerManager<Clayton> mManager;
};

我得到以下编译错误:

Compiling LockerManagerTest.cpp                             : /usr/local/lib/gcc/i686-pc-linux-gnu/3.4.6/../../../../include/c++/3.4.6/bits/stl_pair.h: In constructor `std::pair<_T1, _T2>::pair(const std::pair<_U1, _U2>&) [with _U1 = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _U2 = boost::intrusive_ptr<Locker<Clayton> > (*)(Locker<Clayton>), _T1 = const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _T2 = boost::intrusive_ptr<Locker<Clayton> >]':
../Utilities/include/LockerManager.h:361: instantiated from `bool LockerManager<T>::AddData(const std::string&, T*) [with T = Clayton]'
src/LockerManagerTest.cpp:35: instantiated from here
/usr/local/lib/gcc/i686-pc-linux-gnu/3.4.6/../../../../include/c++/3.4.6/bits/stl_pair.h:90: error: no matching function for call to `boost::intrusive_ptr<Locker<Clayton> >::intrusive_ptr(boost::intrusive_ptr<Locker<Clayton> > (* const&)(Locker<Clayton>))'
/usr/local/boost-1.36.0/include/boost-1_36/boost/intrusive_ptr.hpp:94: note: candidates are: boost::intrusive_ptr<T>::intrusive_ptr(const boost::intrusive_ptr<T>&) [with T = Locker<Clayton>]
/usr/local/boost-1.36.0/include/boost-1_36/boost/intrusive_ptr.hpp:70: note: boost::intrusive_ptr<T>::intrusive_ptr(T*, bool) [with T = Locker<Clayton>]
/usr/local/boost-1.36.0/include/boost-1_36/boost/intrusive_ptr.hpp:66: note: boost::intrusive_ptr<T>::intrusive_ptr() [with T = Locker<Clayton>]
Command exited with non-zero status 1
0:05.40

请帮忙

最佳答案

实际上,intrusive_ptr 已经定义了一个 < 运算符和一个复制构造函数,所以这不是问题。

我们缺少两个主要的东西。首先,我们需要使用 value_type 而不是 make_pair,以避免在 insert 语句中进行隐式类型转换。其次,我们忽略了一个事实,即 intrusive_ptr 构造函数采用一个指针,指向它所围绕的类型。

因此,最终的工作方法如下所示:

// ---------------------------------------------------------------------------
// LockerManager::AddData
// ---------------------------------------------------------------------------
template <typename T>
bool LockerManager<T>::
AddData(const std::string& id, T* pData)
{
Lock<MutualExclusion> lLock(mMutex);

if ((pData == NULL) || (mMap.find(id) != mMap.end()))
return false;

mMap.insert(typename std::map<std::string, boost::intrusive_ptr<Locker<T> > >::value_type(id, new Locker<T>(pData)));

return true;
} // LockerManager::AddData

关于c++ - 帮助在 std::map 中存储模板类的 intrusive_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/741000/

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