質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++/CLI

C++/CLIは、.NET Frameworkの共通言語基盤であるCLI向けにC++を拡張したプログラム言語です。前身のC++マネージ拡張と比較するとシンプルで分かりやすい構文になっており、高い可読性を持ちます。

Q&A

解決済

1回答

3189閲覧

map型初期化で変換失敗:C2440

JanTh1989

総合スコア87

C++/CLI

C++/CLIは、.NET Frameworkの共通言語基盤であるCLI向けにC++を拡張したプログラム言語です。前身のC++マネージ拡張と比較するとシンプルで分かりやすい構文になっており、高い可読性を持ちます。

0グッド

0クリップ

投稿2019/05/08 08:43

編集2019/05/10 01:04

前提

C++/CLIのDLLを作成しています。
同DLL内の他クラス内から参照する定数クラス作成を試みているところとなります。

質問

宣言時に初期化まで行う連想配列std::mapを作成しようとしていますが、以下のエラーが発生します。
対処方法があれば、ご教授願えないでしょうか。
※目的自体は連想配列作成になるため、std::mapにこだわるわけではありません。

エラーコード:C2440
メッセージ:
'初期化中': 'initializer list' から 'std::map<System::String ^,System::Nullable<int> ^,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>> *' に変換できません。

サンプルコード

C++

1ref class constantClass 2{ 3public: 4 static map<System::String^, System::Nullable<int>^>* dic = 5 { 6 { gcnew System::String("AAA"), gcnew System::Nullable<int>(1) }, 7 { gcnew System::String("BBB"), gcnew System::Nullable<int>(2) }, 8 { gcnew System::String("CCC"), gcnew System::Nullable<int>(3) }, 9 { gcnew System::String("DDD"), gcnew System::Nullable<int>(4) }, 10 { gcnew System::String("EEE"), gcnew System::Nullable<int>(5) }, 11 { gcnew System::String("FFF"), gcnew System::Nullable<int>(6) }, 12 { gcnew System::String("GGG"), gcnew System::Nullable<int>(7) } 13 }; 14};

試してみたこと

①System::Collections::Generic::Dictionary型に型変更
⇒エラー「配列初期化子はC++/CLI配列型の配列化にのみ使用できます」が発生。

C++

1 static Dictionary<System::String^, System::Nullable<int>> dic = gcnew Dictionary<System::String^,System::Nullable<int>>() 2 { 3 { gcnew System::String("AAA"), gcnew System::Nullable<int>(1) }, 4 { gcnew System::String("BBB"), gcnew System::Nullable<int>(2) }, 5 { gcnew System::String("CCC"), gcnew System::Nullable<int>(3) }, 6 { gcnew System::String("DDD"), gcnew System::Nullable<int>(4) }, 7 { gcnew System::String("EEE"), gcnew System::Nullable<int>(5) }, 8 { gcnew System::String("FFF"), gcnew System::Nullable<int>(6) }, 9 { gcnew System::String("GGG"), gcnew System::Nullable<int>(7) } 10 };

開発環境

ソフトウェア:Visual Studio 2015 Professional
.NET:バージョン4.6

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2019/05/08 09:10

C++ぢゃねぇ。C++/CLIだ。
JanTh1989

2019/05/08 15:12

すみません。 タグになかったため、無いものと思っており、C++で出していました。 C++タグは削除しました。 タグ追加要望というものがありましたので、追加要望を出しました。
guest

回答1

0

ベストアンサー

とりあえず、基本的なこととして、マネージドとアンマネージドを混在させるのは良くないので、
Dictionaryを使うのなら、System::String^を、std::mapを使うのならstd::stringを使いましょう

やりたいことは違うかもですが、直接連想配列に入れる方法はないので、
配列を連想配列に入れていけばいいと思います

ref class KV { public: System::String^ key; int value; KV(System::String^ k, int v) { key = k; value = v; } }; System::Collections::Generic::Dictionary<System::String^, int>^ CreateDic(array<KV^>^ list) { System::Collections::Generic::Dictionary<System::String^, int>^ dic = gcnew System::Collections::Generic::Dictionary<System::String^, int>(); for each (KV ^ var in list) { dic->Add(var->key, var->value); } return dic; } void Test() { System::Collections::Generic::Dictionary<System::String^, int>^ a = CreateDic(gcnew array<KV^>{ gcnew KV(L"test1", 0), gcnew KV(L"test2", 1), gcnew KV(L"test3", 2), }); }

投稿2019/05/10 05:10

izmktr

総合スコア2856

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JanTh1989

2019/05/13 01:44

返答が遅くなってしまい、すみません。 ご回答ありがとうございます。 しかし、連想配列に初期化子という方法はやはりないのですね・・・。 連想配列に配列という考えはありませんでした。 参考にさせていただきます。 そのほか、静的コンストラクタなどで定義するといった情報もHPで見かけたので、回答頂いた内容含め、いくつか試してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問