cocos2d-xはv3の安定性にまだ不安があるという理由で、v2.2.3を使用しています。
C++11で std::stoi を使いたい
それでも折角ならC++11でコーディングしたいと、そうしています。
XcodeでiOS向けに開発しているときは問題は無かったのですが、いざ、Android版をビルドしようとすると、以下のようなコードで問題が出ました。
#include <string>
auto number = std::stoi("123");
C++11対応
順を追って。
まず、C++11対応の設定。
Application.mk を編集して、"NDK_TOOLCHAIN_VERSION := 4.8"、"-std=c++11"を追加。
NDK_TOOLCHAIN_VERSION := 4.8
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -DCC_ENABLE_CHIPMUNK_INTEGRATION=1 -DCOCOS2D_DEBUG=1 -std=c++11
ライブラリやインクルードファイルのパスも4.8にします。
ビルド
jni/../../Classes/fp.cpp:692:9: error: 'stoi' is not a member of 'std'
そんなの知らないよとエラーになりました。
#if ((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) \
&& !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF))
定義されているソースを眺めると、以上のような条件になっています。
それぞれを確認すると、_GLIBCXX_USE_C99 がdefineされていません。
試しに、std::stoi を使用するコードの先頭で、
#define _GLIBCXX_USE_C99
#include <string>
と指定してビルドし直すと。
.../android-ndk-r9d/sources/cxx-stl/gnu-libstdc++/4.8/include/bits/basic_string.h:2961:31: error: 'wcstold' is not a member of 'std'
……、
これ以上時間をかけてもしようが無いと判断して、std::stoi の利用をやめました。
他で代替はききますし。
結論、解決せず
いまのところこの他に、C++11 での問題には遭遇していません。
この問題、というか制限でしょうか?
cocos2d-x では無く gcc の問題のようです。検索すると同じような質問が散見します。
ただ、なぜこうなるかという解説はあっても解決方法には至りませんでした。
なお、この問題に悩み始めてから、cocos2d-x v3.x.x が C++11ベースのコードになっていることを知りました。