TransWikia.com

をincludeするとコンパイルエラーになる

スタック・オーバーフロー Asked by matsujirushi on December 26, 2020

SpresenseのArduino Platformで、std::stringクラスを使おうと思い、#include <string>したところコンパイルエラーが発生しました。

C++標準ライブラリですが、利用不可でしょうか?

Code:

#include <string>

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}

Error message:

In file included from c:userstakashidocumentsarduinodatapackagesspresensetoolsgcc-arm-none-eabi5.4.1windowsarm-none-eabiincludec++5.4.1bitsstl_algobase.h:61:0,

                 from c:userstakashidocumentsarduinodatapackagesspresensetoolsgcc-arm-none-eabi5.4.1windowsarm-none-eabiincludec++5.4.1bitschar_traits.h:39,

                 from c:userstakashidocumentsarduinodatapackagesspresensetoolsgcc-arm-none-eabi5.4.1windowsarm-none-eabiincludec++5.4.1string:40,

                 from C:UserstakashiAppDataLocalTemparduino_modified_sketch_278803sketch_jul17a.ino:1:

c:userstakashidocumentsarduinodatapackagesspresensetoolsgcc-arm-none-eabi5.4.1windowsarm-none-eabiincludec++5.4.1bitscpp_type_traits.h:168:12: error: redefinition of 'struct std::__is_integer<unsigned char>'

     struct __is_integer<unsigned char>

            ^

c:userstakashidocumentsarduinodatapackagesspresensetoolsgcc-arm-none-eabi5.4.1windowsarm-none-eabiincludec++5.4.1bitscpp_type_traits.h:147:12: error: previous definition of 'struct std::__is_integer<unsigned char>'

     struct __is_integer<bool>

            ^

(Sony developer forumにもポストしています)

4 Answers

Arduinoはソースの拡張子がinoですが、cppも使えると思います。
拡張子cppの別ファイルに#include を書き、それをinoからコールできないでしょうか?

Answered by 池田茂樹 on December 26, 2020

根本解決にはならなさそうですが、Fumu 7さんのご回答を参考に
cpp_type_traits.hの中の、__is_integerを削除してみたところ、
正常にstringがinclude出来ました。
__is_integerを使う用事が無いのでしたら、お試しされるのはいかがでしょうか。

ライブラリ作成されているとなると、他の方は使う事が出来なくなってしまいますが・・・

Answered by SQNK on December 26, 2020

エラーメッセージを読んでみました。

c:userstakashidocumentsarduinodatapackagesspresensetoolsgcc-arm-none-eabi5.4.1windowsarm-none-eabiincludec++5.4.1bitscpp_type_traits.h:168:12: error: redefinition of 'struct std::__is_integer'
struct __is_integer

[直訳]エラー:'struct std::__is_integer'が再定義されてます。

     struct __is_integer<unsigned char>

c:userstakashidocumentsarduinodatapackagesspresensetoolsgcc-arm-none-eabi5.4.1windowsarm-none-eabiincludec++5.4.1bitscpp_type_traits.h:147:12: error: previous definition of 'struct std::__is_integer'
struct __is_integer

[直訳]エラー:'struct std::__is_integer'の以前の定義は

  struct __is_integer<bool>

==
"struct __is_integer < unsigned char>" と "struct __is_integer< bool>" の定義が被っているから駄目だと言っている訳ですが、 素直に読むと"unsigned char" と "bool" は別の型ですから被らないですよね。

それが被るということは、"unsigned char" と "bool"は、同じだという宣言がされているのだと思います。
ヘッダファイルの中に

#def bool unsigned char

#def unsigned char bool

という行がありませんか? あったら、その行をコメントアウトしてください。
そうすれば、エラーが消えると思います。

Answered by Fumu 7 on December 26, 2020

Arduinoの場合、String Objectを使うようです。

https://www.arduino.cc/reference/en/language/variables/data-types/stringobject/

これは普通に使えましたよ。

Answered by Chun on December 26, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP