前回にちょっと書いたが、理由やその他の説明追加
エラーになる理由
簡単に言うと、昔の命令(STL)の名称が変わり、以前のものが未定義なるといったもの。
それゆえ、ビルドエラーになる
これは OpenSiv3Dライブラリ が新型C++20に対応したため。
直し方
旧OpenSiv3Dライブラリファイルを以下に変更する。
以下の表に該当する resolt~ ビルドエラーが出たら直す
| エラー例 |
|---|
| エラー C2039 'result_of': 'std' のメンバーではありません |
| が出て、そのメッセージをダブルクリックして飛んで変更してしまえばOK。 |
| ライブラリ本体を変更するので、他で同じバージョンのエラーはすべて消える。 |
| うまく置換を使えば楽に変更できるかもしれません。 |
| OpenSiv(0.4.2以下) Project(C++11) | VisualStudio2019(16.6.3以降) |
|---|---|
| 変更前 | 変更後 |
| std::result_of | std::invoke_result |
| std::result_of_t | std::invoke_result_t |
ちょっと愚痴
例えばUnityのC#だと、
「この命令は古いです。消える可能性があります」(大意)
となり、使えるけど、もしくはソースコードを新しく書き直す機能ありその場で
変更してくれる(もちろんうまくいかない場合あり)
C言語(SDLエラーで引っかかる命令)では、
「このマクロ使ってね、もしくはこっちの命令を使ってね」(大意)
C++STLで命令名称が変わるなら、
せめてアサートいれて「こっちの命令使ってね」とか、メッセージ出すのは物理的に可能?
GCCがらみや他の開発環境は分かりません。
以前から非推奨となっていたから知ってて当然というC++ならではの高飛車姿勢?
理想は・・・
前回の記事のように、VisualStudio2019 のバージョンによりビルド振り分けがいいと思いますが、
ちょっと面倒なのと、
バージョンによって該当命令がどこのファイルにあるかわからないのでその辺の手間もあったりします。
古いライブラリのプロジェクトが多くあったりしてちょっとビルドしたいとか動作確認したい場合は、
この辺を直接書き換えた方がいいかとは思います。
しかし、たまたまうまくいっただけで、他にもいろいろあるかもしれません。
やり方が分かれば、ビルド設定を C++11 に変更したらもっとも楽なんですが・・・
現状
| OpenSiv3D バージョン | VisualStudio2019(16.6.3以降) |
|---|---|
| 0.4.1 | うまくいってない・・・が実はポカミス ※ |
| 0.4.2 | 幾つかプロジェクトを試したが全く問題なしうまくいく |
※ポカミス
0.4.1 で スペルミス、result >> resolt にしてしまい、気が付かず変なところまで
変更してしまい収拾がつかなくなる。
あまり生産性がない作業なのでまあこの辺にして終了にすることにした。
もっと作業効率がいい方法を閃いたのでもうちょっとやってみました。
別記事で書いています。