コレクションにコレクションを持たすには?

[戻る]
たけ 2004/10/29(金) 20:04:07
CMapに、CStringをキーとしてCArrayを持たせたいのですが
どのように定義したら良いでしょう?

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

ご助言お願いします。

επιστημη 2004/10/29(金) 20:50:10
どんなエラーですか?

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

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

επιστημη 2004/10/29(金) 22:15:40
…だとしてもエラーになりそうです。
CArray<CString,CString> は 代入演算(operator=)が定義されていないので。

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

たけ 2004/10/30(土) 10:29:06
>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です。

こう 2004/10/30(土) 12:17:34
うぎゃ、確かに出来ないですね。
試さずに投稿してたので…ごめんなさい(_ _;
#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 2004/10/30(土) 13:09:35
>> std::map< CString,std::vector<CString> > なら問題ないけど。
> ↑は、標準のコレクションを使用した書き方ですよね。
> 今回は、一応MFCを使った方法を考えています。

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

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

επιστημη [E-Mail] [HomePage] 2004/11/02(火) 13:17:38
こう さんがひとつの解決策を呈示なさってますが、これではダメですか?

たけ 2004/11/02(火) 22:30:26
[[解決]]
結論ですがよくよく考えた結果
CArrayの配列でよくなってしまい、解決です。

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

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

古いスレッドには追加発言できません。