こんにちは、質問がありこちらに書き込みさせて頂きます。
現在VC++.NET(2002)からVC++.NET2003への移行をやっています。
しかし.NET2003になった時点でコンパイルエラーが大量に出てしまい困っています。
エラー内容は
①SmClient error C2316: 'CMemoryException' は、デストラクタまたはコピー コンストラ
クタにアクセスできないためキャッチできません。
②SmClient fatal error C1083: include ファイルを開けません。'fstream.h': No such
file or directory
ばかりなのですが、何が悪いのかさっぱりわかりません。どこを修正すればいいのでしょうか。
try {
m_listTable.AddTail(pObjNew);
} catch (CMemoryException /*e*/) {
TRACE(CSmReferenceTables::operator = () : Memory exeption
has been occurred...);
delete pObjNew;
}
}
①のエラーは上記プログラムの中のCmemoryExceptionで出ています。
どなたか、ご教授よろしくお願いします。
try {
...
} catch (CMemoryException* e) {
// いろいろと尻拭い
e->Delete();
}
じゃなくて?
> 'fstream.h': No such file or directory
#include <fstream.h> → #include <fstream>
1つ目はヘルプでC2316を調べましょう
2つ目はfstream.hの.hをとったらよいと思います
早速のお返事ありがとうございます。
fstream.hについては解決できました。ありがとうございます!!
しかし一つ目のC2316エラーはヘルプで調べてもさっぱりわからないのです。
何か色んな方法がゴチャゴチャ書いてあるだけで結局どうすればいいのか不明なのです。
②のやつは、↓こう書いてあればヘルプではOKが出るみたいに書いてたのですが、
try {
...
} catch (CMemoryException* e) {
// いろいろと尻拭い
e->Delete();
}
私のプログラムでは } catch (CMemoryException /*e*/) {
になっています。 最後も delete pObjNew; です。
これだけ解決できません。
> これだけ解決できません。
指摘の通りに修正すればよいのでは?
>現在VC++.NET(2002)からVC++.NET2003への移行をやっています。
>しかし.NET2003になった時点でコンパイルエラーが大量に出てしまい困っています。
そもそも元のソースは、.NET2002でも動いていたのでしょうか?
どうもまずそうな気がするのですが。。。
# 丸付き数字は環境依存文字ですので、Web上では使わないようにしてください。
すでに指摘していただいた方法で修正を行ってみたところ、
更に別の大量エラーが出てきました。
.NET2003は.NET2002とは全く違う性質を持っているのでしょうか?
今まで.NET2002でうまく動いていたのに、大量のエラーが出てくるので
何かリンカに貼り付けたりすればうまくいくんでしょうか??
> 更に別の大量エラーが出てきました。
例えばどんなものが出ていますか。数によって全ては難しいにしても、いくつか提示されてみては?
> 今まで.NET2002でうまく動いていたのに、大量のエラーが出てくるので
既に Blue さんもご指摘の通り、.NET2002 でもバグに気づいていなかっただけのように見えます。
提示ソースで実際に例外を起こしてみると delete pObjNew; が動かないことがわかると思います。
たまたまコンパイルが通っていただけで、CMemoryException を待ってもそこは通りません。
気づかなかった問題点が表面化したのであれば、地道に直すしかないと思います。
VC++6.0から.NET化をしたのですが、その時に偶然ちょっと修正しただけで
コンパイルを通ったのかもしれません、皆さんのおっしゃる通りなのかも。。。
ちなみに今回修正を加えて更に大量に出たエラーの一部が下記のようなものです。
m_logFile.open(SMLOG_FILE_NAME, ios::ate);
「SmClient error C2065: 'ate' : 定義されていない識別子です。」
ifstream fi(fname, ios::nocreate);
「SmClient error C2065: 'ifstream' : 定義されていない識別子です。」
m_logFile.close();
「SmClient error C2228: '.close' : 左側がクラス、構造体、共用体ではありません。」
DWORD dwFileSize = file.GetLength();
「SmClient warning C4244: '初期化中' : 'ULONGLONG' から 'DWORD' に変換しました。デ
ータが失われているかもしれません。」
などのエラーが約470件ほど出ています。
#include <iostream.h> は古い形式のヘッダです。
#include <iostream> など、C++ の現在の標準ヘッダは全て namespace std 内に
標準関数を定義しています。
上記を見る限り、標準ヘッダの直後に以下の文を入れていくと、
かなりのエラーが取れると思います。(提示エラーだと上から3個はこれで消せそうです)
using namespace std;
意味は、C++ の解説書なりを参照してください。
最後のものは、MFC のバージョンアップに伴うものと思われます。
CFile::GetLength をローカルの MSDN (古いもの)で見ると DWORD ですが、
オンラインでみると ULONGLONG になってます。
どう直すべきかは条件/状況にもよりますので一概にはいえませんが、
下位互換など余計な事を考えなくてよいなら、新しい型にあわせればよいのではないでしょうか。
ありがとうございます!!
using namespace std; を貼り付けてコンパイルをし直したりしているのですが、
やればやるほどエラーが増えていきます。
地道に1つずつ消すしかやはり方法はにないのですよね^^;
> 地道に1つずつ消すしかやはり方法はにないのですよね^^;
おそらくは....。
ありがとうございました、皆さん!
とりあえず地道に1つずつ修正していくところから始めています。
また何か質問が出てきたら書き込みしますので
お力添えよろしくお願いします!!