调试断言:Vector迭代器不兼容(c++)
Debug Assertion : Vector iterators incompatible (C++)
for (int i = 0; i < m_pGameField->dimensions()->first; i++)
{
for (int j = 0; j < m_pGameField->dimensions()->second; j++)
{
for (std::vector<std::shared_ptr<GameGridElement>>::iterator it = m_pGameField->getField(i, j)->getElements().begin();it != m_pGameField->getField(i, j)->getElements().end(); ++it)
{
if ((*it)->getName().compare("Spawn") == 0)
{
tmpSpawns.push_back(std::static_pointer_cast<SpawnElement>((*it)));
}
}
}
}
嘿伙计们,上面的代码有些问题。代码片段应该找到2d游戏领域中的所有刷出。当它到达第三次for迭代的头部时,它会抛出一个Debug断言错误,并显示以下消息"Vector迭代器不兼容"。这是崩溃前一步的值。我从visual studio调试器中得到它们:
getElements()返回{size = 0};i = 0;Begin()返回null的结构体。它是null
我看到向量是空的,但这不应该由it != end()部分处理吗?
您没有发布足够的代码来真正确定,但以下猜测应该是正确的:
getElements()
最有可能按值返回,而不是按引用返回。
std::vector<std::shared_ptr<GameGridElement>> Field::getElements()
{
// ...
return result;
}
返回一个副本!这意味着每次调用getElements
,你会得到一个不同的向量。
对于编译器来说,这没有任何区别。类型安全对您没有帮助,因为std::vector<std::shared_ptr<GameGridElement>>::iterator
是std::vector<std::shared_ptr<GameGridElement>>::iterator
, ,即使您有两个属于不同容器实例的迭代器。它们具有相同的类型,因此代码可以编译。
再考虑这一行:
for (
std::vector<std::shared_ptr<GameGridElement>>::iterator
it = m_pGameField->getField(i, j)->getElements().begin();
it != m_pGameField->getField(i, j)->getElements().end();
++it
)
it
初始化为getElements().begin()
,然后由!=
与getElements().end()
进行比较。但是如上所述,每个getElements()
返回一个不同的向量,因此得到不兼容的迭代器。
这里有一个简单的方法来解决这个问题:
std::vector<std::shared_ptr<GameGridElement>> elements =
m_pGameField->getField(i, j)->getElements();
for (std::vector<std::shared_ptr<GameGridElement>>::iterator it = elements.begin();
it != elements.end(); ++it)
这确保了begin()
和end()
返回的迭代器指向同一个容器实例。
作为参考,这里有一段简单的代码来重现这种行为:
#include <vector>
int main()
{
std::vector<int> v1;
std::vector<int> v2;
bool b = v1.begin() == v2.begin();
}
注意c++标准并没有强制要求在运行时检查迭代器的兼容性。你的编译器必须提供它们,你必须使用正确的编译器选项来启用它们,或者在你不需要它们或负担不起它们时禁用它们。
顺便说一下,如果您可以使用c++ 11,那么您可以使用基于范围的for
循环,不仅可以修复错误,还可以使代码更加简洁。
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 字符类型转换不兼容
- Qt:如何使不兼容的发送方/接收方参数兼容?
- 视觉工作室 2017;启用 /permissive 时,类型 "const wchar_t *" 的参数与类型 "PWSTR" 的参数不兼容
- 使用不兼容的分配器复制分配无序列图
- 类型为 "int*" 的参数与 C++ 中错误类型"int**"参数不兼容
- 该对象具有与成员函数不兼容的类型限定符.为什么会出现此错误?
- 我正在尝试将表的地址传递给要在另一个函数中使用的指针,但得到不兼容的指针类型
- 为什么范围算法与 std 的迭代器不兼容?
- Winpcap Findalldevs const char * 与 char * 不兼容
- C++ 类型的参数与 void (__cdecl*)(void) 类型的参数不兼容,当调用 std::atexit()
- 将"std::string {aka std::basic_string}"赋值中的不兼容类型<char>
- 如何在C++中停止调用不兼容的方法?
- OPENCL 警告:不兼容的指针类型将'float __global[16]'传递给类型为 '__global float4 的参数 *
- 函数范围的静态变量如何导致与共享库中函数代码的未来使用不兼容
- 如何修复"方法的类型与 PInvoke 不兼容"
- C++不兼容的迭代器类型
- 编译器错误"在if语句中分配不兼容的类型"
- 程序无法编译:将 'int (*)[3][3]' 赋值为 'int [9][3][3]' 中的不兼容类型
- boost::mpl 不使用(甚至不兼容)std::p air 的原因是什么?