C++ 在使用GCC 4.8编译时,无法对向量执行std::swap

C++ 在使用GCC 4.8编译时,无法对向量执行std::swap,c++,c++11,gcc,C++,C++11,Gcc,我有一段用C++11编写的代码,可以在VS2013上编译,在x86上可以编译vs120工具集。现在,我正试图使用GCC4.8工具集为ARMv7编译相同的代码,但出现以下错误: no matching function for call to 'swap(__gnu_cxx::__normal_iterator<Collision*, std::vector<Collision> >, std::vector<Collision>::iterator) m_

我有一段用C++11编写的代码,可以在VS2013上编译,在x86上可以编译vs120工具集。现在,我正试图使用GCC4.8工具集为ARMv7编译相同的代码,但出现以下错误:

no matching function for call to 
'swap(__gnu_cxx::__normal_iterator<Collision*, std::vector<Collision> >, std::vector<Collision>::iterator)

m_contacts
std::vector
i
是for循环的迭代器。GCC是否有我遗漏的东西,或者是否有一种特定于GCC的方法来做同样的事情?本质上,我想交换元素在
I
和最后一个元素的位置。

您正试图交换到迭代器,但正在传递一个右值作为两个参数:

m_contacts.begin() + i // an rvalue
m_contacts.end()       // another rvalue
这不会编译,因为右值不能绑定到非constlvalue引用(VS有一个“扩展”允许这样做,这就是为什么您的代码可能会在该平台上编译,具体取决于编译器标志)。通常交换右值也没有多大意义。您需要做的是传递左值:

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());

您正试图切换到迭代器,但正在将右值作为两个参数传递:

m_contacts.begin() + i // an rvalue
m_contacts.end()       // another rvalue
这不会编译,因为右值不能绑定到非constlvalue引用(VS有一个“扩展”允许这样做,这就是为什么您的代码可能会在该平台上编译,具体取决于编译器标志)。通常交换右值也没有多大意义。您需要做的是传递左值:

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());

您正试图切换到迭代器,但正在将右值作为两个参数传递:

m_contacts.begin() + i // an rvalue
m_contacts.end()       // another rvalue
这不会编译,因为右值不能绑定到非constlvalue引用(VS有一个“扩展”允许这样做,这就是为什么您的代码可能会在该平台上编译,具体取决于编译器标志)。通常交换右值也没有多大意义。您需要做的是传递左值:

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());

您正试图切换到迭代器,但正在将右值作为两个参数传递:

m_contacts.begin() + i // an rvalue
m_contacts.end()       // another rvalue
这不会编译,因为右值不能绑定到非constlvalue引用(VS有一个“扩展”允许这样做,这就是为什么您的代码可能会在该平台上编译,具体取决于编译器标志)。通常交换右值也没有多大意义。您需要做的是传递左值:

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());

如果要交换元素,必须取消对迭代器的引用(使用
*
)或使用
std::iter\u swap()
。取消引用container.end()将导致未定义的行为,因此您的代码被破坏。注:MSVC可能会接受该代码,因为它倾向于将临时值(返回值)转换为非常量引用,而兼容编译器不会这样做。

如果要交换元素,则必须取消对迭代器的引用(使用
*
)或使用
std::iter\u swap()
。取消引用container.end()将导致未定义的行为,因此您的代码被破坏。注:MSVC可能会接受该代码,因为它倾向于将临时值(返回值)转换为非常量引用,而兼容编译器不会这样做。

如果要交换元素,则必须取消对迭代器的引用(使用
*
)或使用
std::iter\u swap()
。取消引用container.end()将导致未定义的行为,因此您的代码被破坏。注:MSVC可能会接受该代码,因为它倾向于将临时值(返回值)转换为非常量引用,而兼容编译器不会这样做。

如果要交换元素,则必须取消对迭代器的引用(使用
*
)或使用
std::iter\u swap()
。取消引用container.end()将导致未定义的行为,因此您的代码被破坏。注意:MSVC可能会接受该代码,因为它倾向于将临时值(返回值)转换为非常量引用,而兼容编译器则不会。这是为了删除
i
处的元素。我在某个地方读到,在性能方面,将要删除的元素与向量末尾的元素交换,然后
pop_back()
最后一个元素,这是一种很好的做法。编辑:现在我用谷歌搜索了一下,我注意到我把
end()
back()
@manabreak混淆了
end()
迭代器是过去的结束迭代器,而不是最后一个元素的迭代器。无法取消引用,因为它“指向”没有对象。看起来你想交换元素,而不是迭代器。我无意对迭代器进行操作,但我还是把它们弄混了。这是为了删除
I
中的元素。我在某个地方读到,在性能方面,将要删除的元素与向量末尾的元素交换,然后
pop_back()
最后一个元素,这是一种很好的做法。编辑:现在我用谷歌搜索了一下,我注意到我把
end()
back()
@manabreak混淆了
end()
迭代器是过去的结束迭代器,而不是最后一个元素的迭代器。无法取消引用,因为它“指向”没有对象。看起来你想交换元素,而不是迭代器。我无意对迭代器进行操作,但我还是把它们弄混了。这是为了删除
I
中的元素。我在某个地方读到,在性能方面,将要删除的元素与向量末尾的元素交换,然后
pop_back()
最后一个元素,这是一种很好的做法。编辑:现在我在谷歌上搜索了一下,我没有