- ベストアンサー
右オペランドを扱う演算子は定義されていません。のエラー
ある書籍のサンプルプログラムをVisual C++で「実行」したところ error C2679: 二項演算子 '=' : 型 'class CString' の右オペランドを扱う演算子は 定義されていません。(または変換できません)(新しい動作; ヘルプを参照) となり、エラーとなってしまいました。 このプログラムは、コモンドイアログを利用して、 ダイアログのボタンをクリックするとファイルを開くウィンドウが開き、 選択したファイル名をダイアログのエディットボックスに表示するというプログラムです。 一先ず提供できる情報はこの程度なのですが、(質問はお受けします。) どなたか原因のわかる方はいらっしゃらないでしょうか。 よろしくお願い致します。 ---------------ソース--------------- void CSCHEDULEDlg::OnFileopen() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください char m_sResults; // 開かれたファイル名 CFileDialog m_ldFile(TRUE); // [ファイルを開く]ダイアログウィンドウを表示し、 // その結果の戻り値がID_REQと等しいか比較する if (m_ldFile.DoModal() == ID_REQ) { // 選択されたファイルの名前を取得する m_sResults = m_ldFile.GetFileName(); /*** エラーとなる部分 ***/ // ダイアログの表示を更新する UpdateData(FALSE); }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
char m_sResults; // 開かれたファイル名 の部分は書籍には載っていないのではないでしょうか? m_sResult はおそらく,ファイル名を表示させるエディットボックスに割り当てた,CString 型の DDX 変数だと思います。 書籍に「変数の追加」の方法が載っていませんか? 以下のページも参考にしてみてください。 http://mailsrv.nara-edu.ac.jp/~asait/visual_cpp/dialog1/dialog1.htm http://mailsrv.nara-edu.ac.jp/~asait/visual_cpp/dialog1/editbox/editbox.htm
その他の回答 (1)
- lawson
- ベストアンサー率44% (29/65)
このソースに出てくる技術要素にそんなに詳しくないものですが。 ざっくりみて、変だなと思うことを述べます。 m_sResultsですが。 char型になってます。 これがchar[]や、 char*だとまだなんとか分る気もしますが・・。 char m_sResults を char* m_sResults に変更する。 それでもまだエラーが出るようであれば、 お使いの処理系では、エラーがでる仕様であると 割り切って。 m_ldFile.GetFileName() がCStringのようですが・・ これをさらにchar*に変換するような対策を して下さい。 例えば、 http://rararahp.cool.ne.jp/vc/vctips/cstringchar.htm を参考にして、 m_sResults = m_ldFile.GetFileName(); を strcpy(m_sResults,m_ldFile.GetFileName()); に変更してみるとか・・。
お礼
まずは申し訳ありません。 書籍のサンプルプログラムではchar m_sResultsの変数宣言はありませんでした。 定義されていないと出る・・・無理やり定義してみよう。 文字なのでchar*型(←*は付け忘れていました)だろう。 と勝手に思って付け加えた部分をそのまま掲載してしまいました。 惑わせて申し訳ありませんでした。 そして質問に関してなのですが、No.2の方のおっしゃるように、 書籍にはm_sResultsの変数宣言をCstring型でするようにとあり、 書籍にあるように宣言をしたのですが、エラーが出たため質問をしました。 ・・・が、本日もう一度変数宣言をし直してみたところ、 何故かコンパイル・デバッグが通ってしまいました。 本当に申し訳ない気持ちでいっぱいですが、 今回教えていただいた事は頭の中に留めておきたいと思います。 ありがとうございました。
お礼
No.1の方のお礼でも書きましたが、 すべておっしゃる通りでした。 m_sResultはvoid CSCHEDULEDlg::OnFileopen()で宣言するのではなく、 エディットボックスの void CSCHEDULEDlg::DoDataExchange(CDataExchange* pDX) にDDX変数として宣言するものでした。 安易な思い付きで惑わせて申し訳ありませんでした。 そしてありがとうございました。