エラーの回避方法について教えてください

解決


川島モーツァルト  2004-03-23 02:30:54  No: 53370

こんにちわ。川島モーツァルトです。

出力(画面)に関する記述を行なうと以下のようなエラーが出てしまいました。
なぜ、このようなエラーが出てしまうのでしょうか。
アドバイスお願い致します。

<エラー内容>
error C2679:二項演算子  '<<':
型 'class std::basic_string<char,struct std::char_traits<char>,
class std::allocator<char>>'の右オペランドを扱う演算子は定義されていません。

<エラー箇所>
using namespace std;
<略>
void xxxRows()
{
  string strStmt = "SELECT DEPTNO, DNAME FROM DEPT";
  stmt = db->createStatement(strStmt);
  ResultSet  *rset = stmt->exedcuteQuery();

  try {
    while ( rset->next() ) {
      /*--- ↓ここで上記のエラーが出ます
      cout << "DEPTNO:" << rset->getInt(1) << 
               "DNAME:" << rset->getString(2) << endl;
    }
  } catch(xxx) {
    <略>
  }
  <略>
}

使用しているメソッド(cout内)を以下に説明します
■getInt
<戻り値>int
<引  数>int

■getString()
<戻り値>string
<引  数>int

**環境**
OS:Windows2000
DV:VisualC++6.0(コンソールアプリ)

です。宜しくお願い致します。


YuO  2004-03-23 02:50:53  No: 53371

<string>をインクルードしていないのではないでしょうか。


川島モーツァルト  2004-03-23 03:17:16  No: 53372

YuOさん、ご指摘ありがとうございます。

念のため、<string>はincludeしていました。
cout文は、この実行時以前にも使用しているのですが、
ここだけエラーになってしまいます。

こちらでも、ブレイクを張って調査しているのですが・・・
どうも理由がわかりません。

ただ、問題になっている箇所として、getString()を使用しているところ
ではあるので、getString()の使い方を間違っているのでは?と考えていましたが
マニュアル及びサンプル等にて、特に使用上の問題はないとの結果が出ました。


fuku  2004-03-23 11:01:43  No: 53373

stringクラスにはCStringクラスのoperator LPCTSTRに相当する演算子関数がないためみたいです。

とりあえずstringのメンバ関数c_str()でconst char *が取れるみたいですが・・・


をよよ  2004-03-23 11:03:19  No: 53374

古いiostreamヘッダをインクルードしているということはないですか。

旧:
#include <iostream.h>

新:
#include <iostream> // 拡張子なし


川島モーツァルト  2004-03-23 18:53:07  No: 53375

おはようございます。
fukuさん、をよよさん、夜遅くにアドバイスを頂きありがとうございます。

結果的に、をよよさんのご指摘どおり古いiostream.hをincludeしていました。
<iostream>のincludeにより問題を解決することが出来ました。
ありがとうございました。

投稿の題からそれてしまいますが、
<iostream>と<iostream.h>、大きな違いとは何なんでしょうか。
実際にiostream、iostream.hファイルを覗いて見てみましたが・・・

iostreamでは、extern _CRTIMP ostream cout;
iostream.hでは、ostream.h内で extern ostream_withassign _CRTIMP cout;

これが意味するもの・・・知識無い中で意味わからずです。
お時間が空いた時にでもアドバイス頂ければ幸いです。


YuO  2004-03-23 20:11:04  No: 53376

<iostream>は標準C++ライブラリのヘッダファイルですが,
<iostream.h>は非標準の(古い)ヘッダファイルです。

理由がない限り,<iostream.h>は使うべきではないです。
#VC++.Net 2003では<iostream.h>はサポートされていない。


川島モーツァルト  2004-03-24 02:21:43  No: 53377

YuOさん、アドバイスありがとうございます。

>理由がない限り,<iostream.h>は使うべきではないです。
わかりました。今後、<iostream>を使用するようにします。

※また1つ謎が増えたのですが(しつこくてすいません)
  「理由」とは、どんな理由が考えられるのでしょうか。
  何か例外があってのことなのでしょうか。

とりあえず、当初の問題は解決することが出来ましたので
「-解決-」にします。

ご指摘、アドバイスを頂いたYuOさん、fukuさん、をよよさん
ありがとうございました。


YuO  2004-03-24 02:52:16  No: 53378

>   「理由」とは、どんな理由が考えられるのでしょうか。
>   何か例外があってのことなのでしょうか。

例えば,templateをサポートしていない古いコンパイラやEmbedded C++環境でも,
コンパイルすることができるようにする場合などです。
#これは条件コンパイル+using namespace std;が素直な解かもしれない。

あとは,<iostream.h>を元にした大量のコードがある場合ですかね……。
#いつか<iostream>にしないといけない気もしますが……。


川島モーツァルト  2004-03-24 03:40:46  No: 53379

YuOさん、ありがとうございます。

>#これは条件コンパイル+using namespace std;が素直な解かもしれない。
少しの間、iostreamファイル、iostream.hファイルを眺めていましたが、
iostream(istream)ではtemplateのサポートが確かにありました。

template<class _E, class _Tr=char_traits<_E> >
class basic_istream : virtual public basic_ios<_E, _Tr>{...}

この辺の差なんでしょうね。
何か、ぼわーんと見えてきたような気がします。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加