CMapに、CStringをキーとしてCArrayを持たせたいのですが
どのように定義したら良いでしょう?
CMap(CString, LPCTSTR, CArray<CString,CString>, CArray<CString,CString>>
と書いてもエラーになってしまいます。
ご助言お願いします。
どんなエラーですか?
CMap<CString, LPCTSTR, CArray<CString,CString>, CArray<CString,CString> >
こゆことでしょーか?最後の>>の間にスペースいれてます。
この山括弧をスペース入れずに連続して書くと>>を演算子と解釈してしまうようです。
#CMap直後の'('は'<'ですよね?
環境やエラーの詳細なども書くと良いと思います。
もし的外れな回答だったらごめんなさい。
…だとしてもエラーになりそうです。
CArray<CString,CString> は 代入演算(operator=)が定義されていないので。
# std::map< CString,std::vector<CString> > なら問題ないけど。
>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です。
うぎゃ、確かに出来ないですね。
試さずに投稿してたので…ごめんなさい(_ _;
#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;
>> std::map< CString,std::vector<CString> > なら問題ないけど。
> ↑は、標準のコレクションを使用した書き方ですよね。
> 今回は、一応MFCを使った方法を考えています。
「一応」とは、どの程度の積極性をもった表現なのか分かりません。MFCでなくてはなら
ない、あるいは、標準ライブラリのvectorやmapではいけないという合理的な理由はある
のでしょうか?
もし、そのような理由がないのであれば、行いたいことをより的確に実現できるライブ
ラリを選ぶのが良いと思います(この場合は標準の方になると思われる)。
>「一応」とは、どの程度の積極性をもった表現なのか分かりません。MFCでなくてはなら
>ない、あるいは、標準ライブラリのvectorやmapではいけないという合理的な理由はある
>のでしょうか?
>もし、そのような理由がないのであれば、行いたいことをより的確に実現できるライブ
>ラリを選ぶのが良いと思います(この場合は標準の方になると思われる)。
一応と、適当な書き方をしてしまって申し訳ありません。
チームの方針として、規約でコレクションを使用するならMFCとなっています。
先輩に、コレクションにコレクション持つのがMFCでは無理だったら
標準のでもいいです?と聞いたところ、「ん~、もし不可能だったら考えてみるよ」
っていわれてます。そういう意味で一応MFCで考えています。
こう さんがひとつの解決策を呈示なさってますが、これではダメですか?
結論ですがよくよく考えた結果
CArrayの配列でよくなってしまい、解決です。
また質問していたMFCのCMapにCArrayを持たすのは
そのままでは、不可能ということで理解しました。
でもCArrayを継承してoperator=を定義すればOKそうですね。