前提
C++/CLIのライブラリ開発を行っています。
System::String型変数の値「XXX.YYY」を'.'で分割したいので、変数のSplit関数を引数にSystem::Char^型定数を入れる処理を作りました。
例)
C++
1hファイル 2namespace act{ 3 ref class main{ 4 void output(); 5 }; 6 7 ref class constant{ 8 public: 9 static const System::Char^ SEPARATORCHAR_DOT = gcnew System::Char('.'); 10 }; 11} 12 13cppファイル 14namespace act{ 15 void main::output(){ 16 System::String^ str = gcnew System::String^("XXX.YYY)"; 17 cli::array<String^>^ = str->Split(System::Convert::ToChar(const_cast<Char^>(constant::SEPARATORCHAR_DOT))); 18 } 19}
質問
前提に記載した方法では、Split関数処理部分でTypeinitializationExceptionが発生してしまいます。
Split関数内の処理を分けてみた結果としては、const_cast関数で発生しているエラーのようです。
コンパイル時点では特にエラーは無いのですが、どこに誤りがあり、正常動作をしないのでしょうか?
試してみたこと
①char*型変数に変更
C++
1hファイル 2namespace act{ 3 ref class main{ 4 void output(); 5 }; 6 7 ref class constant{ 8 public: 9 static const char* SEPARATORCHAR_DOT = "."; 10 }; 11} 12 13cppファイル 14namespace act{ 15 void main::output(){ 16 System::String^ str = gcnew System::String^("XXX.YYY)"; 17 cli::array<String^>^ = str->Split(System::Convert::ToChar(const_cast<char*>(constant::SEPARATORCHAR_DOT))); 18 } 19}
⇒C4800の警告がでました。
メッセージ:'char *': ブール値を 'true' または 'false' に強制的に設定します (警告の処理)
開発環境
Visual Studio 2015 Professional
すまない、その関数を投稿してくれない事には何とも言えません。
が、発生しているエラーは、不正に型変更が行われているよというエラーですね。
ここに詳細が書かれていますので、お読みください。
https://docs.microsoft.com/ja-jp/cpp/error-messages/compiler-warnings/compiler-warning-level-3-c4800?view=vs-2019
申し訳ありませんが、"その関数"が何を指しているのかをお教え願えないでしょうか。
関数についてはoutput関数で処理を行います。
例外発生箇所は、output関数内の
str->Split(System::Convert::ToChar(const_cast<Char^>(constant::SEPARATORCHAR_DOT)));
で発生しており、
そのうちの「const_cast<Char^>(constant::SEPARATORCHAR_DOT)」で
発生している旨を記載しているつもりです。
書き方、不足情報がありましたら、お教え下さい。
修正します。
> System::String型変数の値「XXX.YYY」を'.'で分割したいので、変数のSplit関数を引数にSystem::Char^型定数を入れる処理を作りました。
ここの文の事だよー。
多分、私的には「cli::array<String^>^ = str->Split(System::Convert::ToChar(const_cast<Char^>(constant::SEPARATORCHAR_DOT)));」でなんか「>」の演算子がエラーの原因だと睨んでいるよ。
もし貴方がここでシフト演算を行っているつもりなら演算子が違うよ。「>>」だよ。
https://www.javadrive.jp/cstart/ope/index7.html
早速の返答ありがとうございます。
・Split関数でエラーが発生しているという文面の追加。
・C4800が質問意図ではなく、TypeinitializationException回避の方法が質問意図になるため、試してみたことは見出し分け
の2点で文法修正をしました。
あとは念のため、開発環境のVSバージョンも記載しました。
また、記載頂いている「>」の演算子という話ですが、自分としては演算子認識ではありませんでした。
const_cast<Char^>の<>はあくまでconstを外したあとの型指定するための<>であって、特に演算などはしていないつもりです。
あ、なんか勘違いしてましたわ。
普通に区切り文字が1つの場合は「str->Split('.');」で済むからね。
一度const char*をstd::stringにしてから、System::Stringにする方法なら思いつくけど、その辺は私もやったことありませんので少し分かりません。
https://takachan.hatenablog.com/entry/2017/11/29/200234
回答1件
あなたの回答
tips
プレビュー