CArchive << CString

[戻る]
熱血 2009/08/01(土) 06:39:48
MFC VC++ 6.0  XP

出力ファイルに文字列を出力したいのですが、
ar << "test8 \n"
とするとコンパイルエラーになってしまいます。
ヘルプを見ると、CArchive のオペレータ << にchar *(など)の引数を持つメソッド
は、ありません。
でも、CString で定義するとコンパイルエラーは、取れてしまいます。
なぜなのか、よくわかりません。
詳しい方いらっしゃいましたら、よろしくおねがいします。

void CTest8Doc::Serialize(CArchive& ar)
{
    if (ar.IsStoring())
    {
        // TODO: この位置に保存用のコードを追加してください。
        CString str1("test8 \n") ;
        ar << str1 ;
//        ar << "test8 \n"  ;
    }
    else
    {
        // TODO: この位置に読み込み用のコードを追加してください。
    }
}

επιστημη [E-Mail] [HomePage] 2009/08/01(土) 12:05:53
> でも、CString で定義するとコンパイルエラーは、取れてしまいます。
> なぜなのか、よくわかりません。

operator<< が定義されているからでしょう。

http://msdn.microsoft.com/ja-jp/library/331a7zh8.aspx

bun 2009/08/05(水) 10:57:49
いまいち納得いかないみたいなので補足。

以下の operator<< があるが、
  CArchive& operator<<(
     const ATL::CStringT<
        BaseType,
        StringTraits
     >& str
  );

以下の operator<< が無い
  CArchive& operator<<( 
     const char* str
  );

だから、
  ar << "test8 \n";
は エラーで、
  ar << str1 ;
は正常終了

ということです。

tetrapod 2009/08/05(水) 15:54:14
追試してみた
ar<<"abc"; // C2593: operator << があいまいです

CString::CString が explicit ぢゃないから、だね。

熱血 2009/08/10(月) 07:58:39
επιστημηさん、bun さん、tetrapodさん、レスありがとうございます。
επιστημηさんの書いてくださった、ヘルプを見ていたんですが、
すっと理解できなくてこまっていました。
CArchive& operator<<( 
   const ATL::CStringT< 
      BaseType,  
      StringTraits 
   >& str 
);
が該当箇所だとは、思っていたんですが、
CString ってATL (Active Template Library)なの?とか・・・
わたしの予想では、CString は、上記の形に展開される?のでは、と考えています。
BaseTypeは、UCHAR *がはいるのかな?StringTraits にstr1がはいって、

   const ATL::CStringT< 
      BaseType,  
      StringTraits 
   >
のところは、CStringT<UCHAR *,Str1>みたいな感じかな・・・と、いう予想していま
す。
・・・・

tetrapod 2009/08/10(月) 10:25:37
ええっと、正直言って「何がわからんのかわからん」「何が聞きたいのかわからん」
Q&A ならば少なくとも質問は Q つまり疑問文で提示してくれ。
不明点があって要解説ならば、ピンポイントで何がわからんのか提示してくれ。

Q1. operator<< って何かわかりません、解説してください
Q2. CString って何か ry)
Q3. CStringT と CString の関連が ry)
Q4. C2593 エラーになる原因が ry)
のように具体的に訊いておくんなまし。

俺はこう思いますが正しいですか?という質問に対する答えは Yes または No だ。
そういう質疑応答を期待しているならまた話は別だが・・・

熱血 2009/08/10(月) 14:03:41
tetrapod さん、レスありがとうございます。質問があいまいですいません。
(すいません、かなり返事がおくれていたので、なにか返したくて書きました)

わからないのは、ヘルプの記述内容なのですが、
<ヘルプの内容>
CArchive& operator<<( 
   const ATL::CStringT< 
      BaseType,  
      StringTraits 
   >& str 
);
<コーディング>
CString str1("test8 \n") ;
   ar << str1 ;
で、arはCArchiveなので、operate<<を定義するのは、わかるのですが、
   const ATL::CStringT< 
      BaseType,  
      StringTraits 
   >
の形宣言のところがよくわかりません。

熱血 2009/08/10(月) 14:04:34
Q3ですね。CStringT と CString の関連がよくわかりません。

επιστημη [E-Mail] [HomePage] 2009/08/10(月) 14:38:44
> CStringT と CString の関連がよくわかりません。

CString は
ATL::CStringT<char,StrTraitMFC_DLL<char,ATL::ChTraitsCRT<char>>>
または
ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>
のいずれか(UNICODEか否かで切り替わる)の typedef です。

rin 2009/08/10(月) 17:44:34
VC6はVC6のヘルプを見たほうがいいと思う

熱血 2009/08/10(月) 18:34:47
[[解決]]
επιστημηさん、rinさん、レスありがとうございます。
CStringは、typedefでしたか・・・なるほど、よくわかりました。
VC6のマニュアルのキーワード検索をかけても、CStringT はでてきませんでした。
まだ、気がつかないところに書いているかもしれませんが・・・
なかなか、むずかしいですね。
ありがとうございました。

tetrapod 2009/08/10(月) 19:12:51
VC++6 の頃の CString は ATL ベースではないので CStringT を使っていない。
というわけで・・・ CStringT が出ているヘルプを参考にしているのであれば
うん、見るべきヘルプが異なっている。 CStringT は VC++2003 以後の話。

今の MSDN Online はユーザーの多い(新しい)ほうのヘルプが優先して表示されるので
先に表示されるのは VC++2008, 2005, 2003 などの新しい内容になっている。
過去の遺物である VC++6 専用のヘルプはうまく探さないと見つからないよ。

VC++6 に付属の MSDN CD-ROM (2001年4月以前)をまず見るのが先決。

んで、今回のこの件を解説するなら:
・CArchive に CString を挿入する operator << が存在する
 なので ar<<cs; はうまく通る
・CArchive に const char * を挿入する operator << は無い
 なので本来 ar<<"aaa"; は「対応する<<がない」エラーになるはずである。
・ところが CString::CStrig(const char*) が explicit でないので
 ar << CString("aaa"); と解釈すると挿入できてしまう。
※explicit とは、この「勝手に行われる暗黙変換」を禁ずる機能。
・俺は探しきれていないんだけど、もうひとつ以上の経路で同様に
 ar << ほにゃらら("aaa"); と解釈すると挿入できてしまう。=あいまい
ということで C2593 あいまいですエラーになるという寸法だ。

で、なぜいまさら VC++6 なの?そんな過去の遺物にすがりつくべき時代じゃない。
お勉強用途なら Visual Studio 2008 Express Edition のほうがいい。
ただだし、最新 C++ 言語仕様書に対応しているし、良い事尽くめだよ
(MFC は無いが)

熱血 2009/08/10(月) 19:58:51
tetrapod さん、レスありがとうございます。
VC++6.0は、学生のときになけなしのお金をだして、買ったので
なかなか手放せないです。3万5千円ぐらいでした。
Express Edition は、別にして・・・
いまのコンパイラって12万ぐらいしたとおもいますけど・・

> 最新 C++ 言語仕様書に対応しているし

ということは、VC++6.0は、対応していないということですね。
でもMFCなかったらたいへんじゃねいですか・・・

tetrapod 2009/08/10(月) 20:42:28
> VC++6.0は、対応していないということですね。
言語規格書(言語仕様書)採択前の処理系だから対応しようがないよね

> でもMFCなかったらたいへんじゃねいですか・・・
何をしたいのか?それ次第だったりする
・Windows アプリにこだわらず現代 C/C++ を使いたい
 =迷うことなく 2008 Express または cygwin へ移行すべき
・C/C++ にこだわらず Windows アプリが作りたい
 =ぶっちゃけ C# とかのほうが楽だと思う。
・MFC で Windows アプリが作りたい
 =Visual Studio 2008 Professional 以上がおすすめ (VC++6 でもいいけど)

ただ、やっぱり MFC は基礎設計が20年以上前なので今見ると古さを感じるよ。
この業界、過去の遺物を学ぶよりは、先端を追いかけるほうがいいと思う・・・

rin 2009/08/10(月) 21:11:10
言葉足らずですいません。

VC6をつかってるなら、VC6のヘルプを見るべきで
VC6のMSDNには、
CString のoperator << >>について説明のページがあり
そこに、ダンプリストとCArchiveの入出力へのサポートがあると説明があります

.netは2005以降しかもってないのけど
CStringTには<< >>がなくなってるから、対応が変わったのかな

熱血 2009/08/11(火) 02:42:42
tetrapod さん、rinさん、レスありがとうございます。
MFC で Windows アプリが作りたい
と
現代 C/C++ を使いたい
と両方ですね。
今は、グラフィックエディタみたいなものをつくっているので、MFCスケルトンがな
ければ、大変です。
VC++6.0を買ったときは、学生だったので、アカデミック価格でしたが、一般価
格は、プロフェッショナルで6万前後だったと思います。いまは、10万超えますもの
ね・・・でも、あたらしいのほしいですね。ちょっと検討してみます。

PATIO 2009/08/11(火) 10:14:38
まだ、有効だったか忘れましたが、
ExpressEditionを持っていれば、アップグレード版が使えたと思います。
素で買うよりは幾ばくか安くなります。

私の場合、純粋なC++を試したい時はVC++2008ExpressEditionを使いますが、
アプリを組むときはVC#に移行しました。
個人で10万近いお金を出すのはしんどいというのは私も同感です。
VC#だとExpressEditionでもリソースベースで編集できます。
あと、ライブラリのつくりとしてはMFCよりも今の.NET Frameworkの方が
良く出来ていると感じる事も多いです。
まあ、起動時間が若干長いのが玉に傷ですが、個人ベースで作るものなら
そこまで性能に拘る事も無いかなと思いますし、
C#で作成するにしても工夫次第ではある程度の性能は出せると思いますよ。

アプリを作るのが目的なのか、C++の勉強をするのが目的なのかでも
話は違ってきそうですけれど。

επιστημη [E-Mail] [HomePage] 2009/08/11(火) 11:29:58
C++で書きたいけどUI実装がめんどっちー、
そんなアナタに C# と C++/CLI のコンビ。
UIはC#でさくさくデザイン、キモのロジックはC++/CLI。ってゆー。

熱血 2009/08/11(火) 21:57:38
いつも、お世話になっている、PATIOさんやεπιστημηさんから、こういうご意見を
いただけるのは、とてもありがたいです。とても重要な参考意見として検討したいと思
います。ありがとうございました。

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