std::映射导致插入时出现C2664错误
std::map causing C2664 error when inserting
我正在编写自己的内存分配器来跟踪应用程序中使用的内存。我目前只是在一个独立的测试台上测试它。到目前为止,我遇到的错误是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&;'具有[_Ty=std::对<__int64*const,MemBlock>,_Kty=intptr_ t*,_Pr=标准::小于<__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返回类型的文档。
- 使用解算器SparseLU并获得错误C2664
- VS 2017 错误 C2664 地图插入尝试
- 使用自定义对象声明shared_ptr数组时出现错误 C2664
- 编译器错误 C2664 使用 std::map 和自定义类作为其值
- 如何在 VC++ 中通过引用传递另一个对象的方法(错误 C2664)
- 在C++中构造模板函数时出现编译错误 C2664 和 C2440
- 了解错误 C2664:无法转换参数 1
- 错误 C2664:无法从'NvPhysicalGpuHandle'转换参数 1
- 错误 C2664 和 E0167 被难倒
- 尝试创建unique_ptr时出现错误 C2664
- 错误 C2664:"errno_t wcstombs_s(size_t *,字符 *,size_t,常量 wchar_t *,size_t)":无法转换参数 4
- 错误C2664:无法转换参数错误
- 在集合中转换为小写 C++ 错误 C2664
- 错误 C2664:无法将参数 1 从 'int' 转换为 'int []'
- 将互斥锁数组传递给函数时出现错误 C2664
- 错误 C2664:"发送":无法将参数 2 从"服务器问候语"转换为"常量字符 *"
- 错误C2664:无法转换参数(指纹传感器检测)
- C++ 错误 1 错误 C2664 传递数组指针
- 错误 C2664:'CComboBox::InsertString':无法将参数 2 从 'const char [4]' 转换为 'LPCTSTR'
- 创建面向对象的链表时出现编译问题(编译器错误C2664)