std::映射导致插入时出现C2664错误

std::map causing C2664 error when inserting

本文关键字:错误 C2664 插入 映射 std      更新时间:2023-10-16

我正在编写自己的内存分配器来跟踪应用程序中使用的内存。我目前只是在一个独立的测试台上测试它。到目前为止,我遇到的错误是C2664,这是我第一次使用std::map遇到它。

这是地图:

std::map<intptr_t*, MemBlock> mAllocatedMemory;

这是尝试插入它的代码:

std::pair<std::_Tree<std::_Tmap_traits<void*, MemBlock, std::less<void*>, std::allocator<std::pair<void*const, MemBlock>>, false>>::iterator, bool> buffer = mAllocatedMemory.insert(std::make_pair(pmem->memAddress, pmem));

这是内存块结构:

typedef struct nMemBlock {
public:
bool isMemBlockFree;
size_t memSize;
size_t memMemorySize;
intptr_t * memAddress;
nMemBlock * memNext;
public:
nMemBlock(void) {}
~nMemBlock(void) {
delete memAddress; memAddress = nullptr;
delete memNext; memNext = nullptr;
}
} MemBlock;

以下是内存分配器,我说我正在测试以前从未写过的东西:

class MemAllocator {
// Methods
public:
MemBlock * AllocateMemBlock(size_t size) {
MemBlock * block = (MemBlock*)malloc(0);
void * memAddress = (void*)malloc(0);
void * allocateMem = (void*)malloc(MemBlockSize * size);
if (allocateMem == (void*)-1) {
return nullptr;
}
else {
block->isMemBlockFree = false;
block->memAddress = static_cast<intptr_t*>(memAddress) + MemBlockSize;
block->memMemorySize = sizeof(MemBlock) * size;
block->memNext = nullptr;
block->memSize = size;
}
return block;
}
// Constructors
public:
MemAllocator() {
}
~MemAllocator() {
}
// Operators
public:
// Members
private:
};

这是我用于分配器的类:

class MemManager_Test : public MemAllocator
{
// Methods
public:
void AddMemoryBlock(size_t size) {
MemBlock * pmem = AllocateMemBlock(size);
if (pmem == nullptr) {
// handle error
return;
}
// this seems to be the line causing the problem, it's saying something about "no instance overloading"??
std::pair<std::_Tree<std::_Tmap_traits<void*, MemBlock, std::less<void*>, std::allocator<std::pair<void*const, MemBlock>>, false>>::iterator, bool> buffer = mAllocatedMemory.insert(std::make_pair(pmem->memAddress, pmem));
}
// Constructors
public:
MemManager_Test() {
}
~MemManager_Test() {
}
// Operators
public:
// Members
private:
std::map<intptr_t*, MemBlock> mAllocatedMemory;
size_t mSize;
};

UPDATE在构造时似乎无法转换对的第一个类型或intptr_t*

编译器输出显示:

s-ct-main.cppz: \游戏引擎\宁静引擎\代码\控制台测试台\包括\ s-ct-mem-manager.h(163(:错误C2664:"std::_Tree_iterator>>std::_Tree>::insert(std:::_Tree_const_iterator>>,const std::pair&amp;'具有[_Ty=std::对&lt__int64*const,MemBlock>,_Kty=intptr_ t*,_Pr=标准::小于&lt__int64**,_Alloc=std::分配器>>和[_Kty=intptr_ t*,_Ty=MemBlock]z: \游戏引擎\宁静引擎\代码\控制台测试台\包括\ s-ct-mem-manager.h(163(:注意:原因:无法从"std::pair"转换为"std::pair"具有[_Kty=intptr_ t*,_Ty=MemBlock]z: \游戏引擎\宁静引擎\代码\控制台测试台\包括\ s-ct-mem-manager.h(163(:注意:没有用户定义的转换运算符可以执行此转换,或者该运算符不能称为

为其分配mAllocatedMemory.insert(std::make_pair(pmem->memAddress, pmem))返回值的对象的类型不正确。

如果您能够使用C++11或更高版本,请使用auto类型说明符。

auto res = mAllocatedMemory.insert(std::make_pair(pmem->memAddress, pmem));

如果您使用的是该语言的早期版本,则需要使用显式类型std::pair<std::map<intptr_t*, MemBlock>::iterator, bool>

std::pair<std::map<intptr_t*, MemBlock>::iterator, bool> res = 
mAllocatedMemory.insert(std::make_pair(pmem->memAddress, pmem));

请参阅https://en.cppreference.com/w/cpp/container/map/insert有关CCD_ 5返回类型的文档。