コレクションにコレクションを持たすには? – プログラミング – Home

コレクションにコレクションを持たすには...
 
通知
すべてクリア

[解決済] コレクションにコレクションを持たすには?


たけ
 たけ
(@たけ)
ゲスト
結合: 24年前
投稿: 116
Topic starter  

CMapに、CStringをキーとしてCArrayを持たせたいのですが
どのように定義したら良いでしょう?

CMap(CString, LPCTSTR, CArray<CString,CString>, CArray<CString,CString>>
と書いてもエラーになってしまいます。

ご助言お願いします。


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

どんなエラーですか?


返信引用
こう
 こう
(@こう)
ゲスト
結合: 23年前
投稿: 79
 

CMap<CString, LPCTSTR, CArray<CString,CString>, CArray<CString,CString> >
こゆことでしょーか?最後の>>の間にスペースいれてます。
この山括弧をスペース入れずに連続して書くと>>を演算子と解釈してしまうようです。
#CMap直後の'('は'<'ですよね?

環境やエラーの詳細なども書くと良いと思います。
もし的外れな回答だったらごめんなさい。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

…だとしてもエラーになりそうです。
CArray<CString,CString> は 代入演算(operator=)が定義されていないので。

# std::map< CString,std::vector<CString> > なら問題ないけど。


返信引用
たけ
 たけ
(@たけ)
ゲスト
結合: 24年前
投稿: 116
Topic starter  

>CMap<CString, LPCTSTR, CArray<CString,CString>, CArray<CString,CString> >
>こゆことでしょーか?最後の>>の間にスペースいれてます。
>この山括弧をスペース入れずに連続して書くと>>を演算子と解釈してしまうようです。
ご指摘のとおり↓のようにやってみました。
CMap<CString, LPCTSTR, CArray<CString,CString>, CArray<CString,CString> > m_map;

>#CMap直後の'('は'<'ですよね?
コピーミスでした。

しかし、↓のようなエラーになります。

d:\program files\microsoft visual studio\vc98\mfc\include\afxtempl.h(1477) :
error C2664: 'SetAt' : 2 番目の引数を 'class CArray<class CString,class
CString>' から 'class CArray<class CString,class CString>' に変換できません。
(新しい機能 ; ヘルプを参
照)
class 'CArray<class CString,class CString>' にコピー コンストラクタを使用すること
はできません
d:\program files\microsoft visual studio\vc98\mfc\include\afxtempl.h
(1566): クラス テンプレートのメンバ関数 'void __thiscall CMap<class CString,char const
*,class CArray<class CString,class CString>,class CArray<class CString,class
CString> >::Seriali
ze(class CArchive &)' のコンパイル中
testDlg.cpp
d:\program files\microsoft visual studio\vc98\mfc\include\afxtempl.h(1477) :
error C2664: 'SetAt' : 2 番目の引数を 'class CArray<class CString,class
CString>' から 'class CArray<class CString,class CString>' に変換できません。
(新しい機能 ; ヘルプを参
照)
class 'CArray<class CString,class CString>' にコピー コンストラクタを使用すること
はできません
d:\program files\microsoft visual studio\vc98\mfc\include\afxtempl.h
(1566): クラス テンプレートのメンバ関数 'void __thiscall CMap<class CString,char const
*,class CArray<class CString,class CString>,class CArray<class CString,class
CString> >::Seriali
ze(class CArchive &)' のコンパイル中
コードを生成中...
cl.exe の実行エラー

>std::map< CString,std::vector<CString> > なら問題ないけど。
↑は、標準のコレクションを使用した書き方ですよね。
今回は、一応MFCを使った方法を考えています。

環境は、win2000,VC6.0です。


返信引用
こう
 こう
(@こう)
ゲスト
結合: 23年前
投稿: 79
 

うぎゃ、確かに出来ないですね。
試さずに投稿してたので…ごめんなさい(_ _;
#MFCはあんま使わないもんで…operator=くらい定義してると思ってました(^^;

どうしてもMFCとあれば、ちょっと強引かも知れない解決策です。
動作は見てないですけど、いちおコンパイルは通りました。
#CStringArrayを使ってるけど、CArray<CString>でも問題ないと思います。

struct CStrArray : public CStringArray
{
  //ないもの(operator=)は自分で作ってみる。
  CStrArray& operator=(const CStrArray& rhs) {
    Copy(rhs);
    return *this;
  }
};
CMap<CString, LPCTSTR, CStrArray, const CStrArray& > map;


返信引用
monkey
 monkey
(@monkey)
ゲスト
結合: 21年前
投稿: 70
 

>> std::map< CString,std::vector<CString> > なら問題ないけど。
> ↑は、標準のコレクションを使用した書き方ですよね。
> 今回は、一応MFCを使った方法を考えています。

「一応」とは、どの程度の積極性をもった表現なのか分かりません。MFCでなくてはなら
ない、あるいは、標準ライブラリのvectorやmapではいけないという合理的な理由はある
のでしょうか?
もし、そのような理由がないのであれば、行いたいことをより的確に実現できるライブ
ラリを選ぶのが良いと思います(この場合は標準の方になると思われる)。


返信引用
たけ
 たけ
(@たけ)
ゲスト
結合: 24年前
投稿: 116
Topic starter  

>「一応」とは、どの程度の積極性をもった表現なのか分かりません。MFCでなくてはなら
>ない、あるいは、標準ライブラリのvectorやmapではいけないという合理的な理由はある
>のでしょうか?
>もし、そのような理由がないのであれば、行いたいことをより的確に実現できるライブ
>ラリを選ぶのが良いと思います(この場合は標準の方になると思われる)。
一応と、適当な書き方をしてしまって申し訳ありません。
チームの方針として、規約でコレクションを使用するならMFCとなっています。
先輩に、コレクションにコレクション持つのがMFCでは無理だったら
標準のでもいいです?と聞いたところ、「ん~、もし不可能だったら考えてみるよ」
っていわれてます。そういう意味で一応MFCで考えています。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 21年前
投稿: 600
 

こう さんがひとつの解決策を呈示なさってますが、これではダメですか?


返信引用
たけ
 たけ
(@たけ)
ゲスト
結合: 24年前
投稿: 116
Topic starter  

結論ですがよくよく考えた結果
CArrayの配列でよくなってしまい、解決です。

また質問していたMFCのCMapにCArrayを持たすのは
そのままでは、不可能ということで理解しました。

でもCArrayを継承してoperator=を定義すればOKそうですね。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました