我是cpp的初学者,我有一些这样的代码:
#include <iostream>
#include <utility>
#include <map>
#include <unordered_map>
template<typename T,typename EX>
class Attachable
{
static std::unordered_map<T*,Attachable<T,EX>> attachCaches;
std::unordered_map<std::string,EX> datas;
Attachable(T* sender):m_attachedObj(sender)
{
}
bool operator==(const Attachable& other)const
{
return m_attachedObj == other.m_attachedObj;
}
public:
static Attachable<T,EX> attach(T* sender)
{
if(attachCaches.find(sender)==attachCaches.end())
{
attachCaches.insert(std::make_pair((sender),Attachable<T,EX>(sender)));
}
return attachCaches[(sender)];
}
void set(std::string key,EX properties)
{
datas.insert(key,properties);
}
EX get(std::string key)
{
return datas.at(key);
}
private:
T* m_attachedObj;
};
class Tester
{
public :
Tester(){}
};
int main()
{
Tester* a =new Tester();
Attachable<Tester,std::string>::attach(a).set("test","typeOfInt");
std::cout<< Attachable<Tester,std::string>::attach(a).get("test");
}
当我尝试编译这段代码时,我将在第952行收到一个错误,在名为emplace(*_First);
的函数处
template <class _Iter, class _Sent>
void _Insert_range_unchecked(_Iter _First, const _Sent _Last) {
for (; _First != _Last; ++_First) {
emplace(*_First);
}
}
我尝试使用一些基本的指针,如int,但这仍然不起作用:
int* a =new int(4);
Attachable<int,std::string>::attach(a).set("test","typeOfInt");
std::cout<< Attachable<int,std::string>::attach(a).get("test");
1条答案
按热度按时间kognpnkq1#
如果
sender
不在map中,attachCaches[(sender)]
可能需要默认构造一个Attachabe
对象。但是Attachable
不提供默认构造函数。因为你实际上知道键总是在Map中,你可以用这种方式实现attach
(也更高效,因为它消除了冗余的查找):还要注意函数现在如何通过引用返回
Attachable
。您的原始代码返回了map元素的临时副本;然后在该副本上调用set
;那份拷贝就被销毁了map中的原始值从未更新过,因此后续的get
没有找到传递给set
的值。Demo