2013-01-17 42 views
3

下面的代碼編譯罰款C++ 11的Android載體不與的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__

+0

它是*實際*代碼嗎? – Nawaz

+0

是的。發佈這三行會產生相同的錯誤。 – Grapes

+0

移動未正確實施。 – Nawaz

回答

4

看來在編譯器中有兩個錯誤。首先,它不正確地調用push_back(T&&)然後試圖移動對象,這是實現incorrecty:

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

不正確執行您使用該編譯器是什麼版本的?

+0

謝謝,我已經從NDK8d中複製了libstdC++,它似乎解決了這個問題。 – Grapes

+1

恐怕如果真的解決了這個問題。編譯器不會給出錯誤,是**不是**缺少缺陷的跡象。如果它仍然解析爲'push_back(T &&)'但'move'正常工作呢?這甚至是一個更大的問題。當你傳遞一個左值時,你需要確保它不調用'push_back(T &&)'。 – Nawaz