こんにちわ。川島モーツァルトです。
出力(画面)に関する記述を行なうと以下のようなエラーが出てしまいました。
なぜ、このようなエラーが出てしまうのでしょうか。
アドバイスお願い致します。
<エラー内容>
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(コンソールアプリ)
です。宜しくお願い致します。
<string>をインクルードしていないのではないでしょうか。
YuOさん、ご指摘ありがとうございます。
念のため、<string>はincludeしていました。
cout文は、この実行時以前にも使用しているのですが、
ここだけエラーになってしまいます。
こちらでも、ブレイクを張って調査しているのですが・・・
どうも理由がわかりません。
ただ、問題になっている箇所として、getString()を使用しているところ
ではあるので、getString()の使い方を間違っているのでは?と考えていましたが
マニュアル及びサンプル等にて、特に使用上の問題はないとの結果が出ました。
stringクラスにはCStringクラスのoperator LPCTSTRに相当する演算子関数がないためみたいです。
とりあえずstringのメンバ関数c_str()でconst char *が取れるみたいですが・・・
古いiostreamヘッダをインクルードしているということはないですか。
旧:
#include <iostream.h>
新:
#include <iostream> // 拡張子なし
おはようございます。
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;
これが意味するもの・・・知識無い中で意味わからずです。
お時間が空いた時にでもアドバイス頂ければ幸いです。
<iostream>は標準C++ライブラリのヘッダファイルですが,
<iostream.h>は非標準の(古い)ヘッダファイルです。
理由がない限り,<iostream.h>は使うべきではないです。
#VC++.Net 2003では<iostream.h>はサポートされていない。
YuOさん、アドバイスありがとうございます。
>理由がない限り,<iostream.h>は使うべきではないです。
わかりました。今後、<iostream>を使用するようにします。
※また1つ謎が増えたのですが(しつこくてすいません)
「理由」とは、どんな理由が考えられるのでしょうか。
何か例外があってのことなのでしょうか。
とりあえず、当初の問題は解決することが出来ましたので
「-解決-」にします。
ご指摘、アドバイスを頂いたYuOさん、fukuさん、をよよさん
ありがとうございました。
> 「理由」とは、どんな理由が考えられるのでしょうか。
> 何か例外があってのことなのでしょうか。
例えば,templateをサポートしていない古いコンパイラやEmbedded C++環境でも,
コンパイルすることができるようにする場合などです。
#これは条件コンパイル+using namespace std;が素直な解かもしれない。
あとは,<iostream.h>を元にした大量のコードがある場合ですかね……。
#いつか<iostream>にしないといけない気もしますが……。
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>{...}
この辺の差なんでしょうね。
何か、ぼわーんと見えてきたような気がします。
ありがとうございました。
ツイート | ![]() |