我有一段用C ++ 11编写的代码,可以在x86上编译VS2013和vs120工具集。现在,我尝试使用GCC 4.8工具集为ARMv7编译相同的代码,但是我收到以下错误:
no matching function for call to
'swap(__gnu_cxx::__normal_iterator<Collision*, std::vector<Collision> >, std::vector<Collision>::iterator)
这是产生此错误的代码行:
std::swap(m_contacts.begin() + i, m_contacts.end());
m_contacts
是std::vector<Collision>
,i
是for循环的迭代器。 GCC是否缺少某些东西,或者是否有GCC特定的方法来做同样的事情?基本上我想在i
和最后一个元素交换元素的位置。
答案 0 :(得分:2)
如果要交换元素,则必须取消引用迭代器(使用*
)或使用std::iter_swap()
。取消引用container.end()
会导致未定义的行为,因此您的代码会被破坏。注意,MSVC可能接受了代码,因为它倾向于将临时值(returnvalues)转换为非const引用,而兼容的编译器则不然。
答案 1 :(得分:1)
您正在尝试交换迭代器,但是将rvalues作为两个参数传递:
m_contacts.begin() + i // an rvalue
m_contacts.end() // another rvalue
这不会编译,因为rvalue无法绑定到非constlvalue引用(VS有一个“扩展”允许这样做,这就是为什么你的代码可能在该平台上编译,这取决于编译器标志。)它一般而言交换rvalues也没什么意义。你需要做的是传递左值:
auto a = m_contacts.begin() + i;
auto b = m_contacts.end();
std::swap(a, b);
你想要交换像这样的迭代器的原因尚不清楚。如果要将元素与向量中的最后一个元素交换,可以使用
auto a = m_contacts.begin() + i;
std::swap(*a, m_contacts.back());