C++ 在使用GCC 4.8编译时,无法对向量执行std::swap
我有一段用C++11编写的代码,可以在VS2013上编译,在x86上可以编译vs120工具集。现在,我正试图使用GCC4.8工具集为ARMv7编译相同的代码,但出现以下错误: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_
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()
最后一个元素,这是一种很好的做法。编辑:现在我在谷歌上搜索了一下,我没有