Следующий код прекрасно компилируется при использовании STLPort:
std::vector<Engine::Screen::IOverlay*> Overlays;
auto TestOverlay=new Engine::Screen::Overlay();
Overlays.push_back(TestOverlay);
Однако при компиляции с libstdc ++ он пытается использовать конструктор перемещения по некоторым причинам:
error : cannot bind 'Engine::Screen::IOverlay*' lvalue to 'Engine::Screen::IOverlay*&&' ...\android-ndk-r8\sources\cxx-stl\gnu-libstdc++\include\bits\move.h
Это очень простой пример, но эта проблема возникает в приложении для всех локальных указателей при использовании push_back.
Ошибка в файле move.h:
template<typename _Tp>
inline typename std::remove_reference<_Tp>::type&&
move(_Tp&& __t)
{ return __t; }
Пример 2 (Еще один базовый тест, который я написал 🙂
class TestClass {};
auto TestInstance=new TestClass;
std::vector<TestClass*> TestVector;
TestVector.push_back(TestInstance);
Я скомпилировал с ndk r8: -std = c ++ 11 -D__STDC_INT64__
Кажется, в компиляторе есть две ошибки. Сначала это неправильно вызываетpush_back(T&&)
который затем пытается переместить объект, что неправильно реализовано:
template<typename _Tp>
inline typename std::remove_reference<_Tp>::type&&
move(_Tp&& __t)
{ return __t; }
Это должно быть реализовано как:
template<class _Tp>
typename remove_reference<_Tp>::type&&
move(_Tp&& __t) noexcept //noexcept should be here!
{
return static_cast<typename remove_reference<_Tp>::type&&>(__t);
}
Это означает, что ваш компилятор показывает две ошибки в этом контексте:
push_back(T&&)
,std::move
какую версию какого компилятора вы используете?
Других решений пока нет …