12

いくつかの前方宣言を含むヘッダー ファイルがありますが、ヘッダー ファイルを実装ファイルにインクルードすると、前の前方宣言のインクルードの後に​​インクルードされ、このようなエラーが発生します。

error: using typedef-name ‘std::ifstream’ after ‘class’
/usr/include/c++/4.2.1/iosfwd:145: error: ‘std::ifstream’ has a previous declaration.

class ifstream;

class A
{
    ifstream *inStream;
}
// End of A.h

#include <ifstream>
using std::ifstream;

#include "A.h"

// etc

これを回避するための標準は何ですか?

前もって感謝します。

4

7 に答える 7

25

std:ifstreamを前方宣言しないでください-<iosfwd>代わりにインポートするだけです。

ifstreamはtypedefです。

詳細については、こちらを参照してください:http: //gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.2/group__s27__2__iosfwd.html

于 2010-06-03T04:49:07.973 に答える
2

実際には2つの問題があります。

1つ目は、Kirillがすでに指摘しているように、C++ではtypedefを前方に宣言するのはかなり難しいということです。

2つ目はifstream、特定のテンプレートのインスタンス化のtypedefですbasic_ifstream。コンパイラがテンプレートを展開できるようにするには、テンプレートの本体がすでに定義されている必要があります。つまり、インスタンス化されたテンプレートを前方宣言することはできません。

于 2010-06-03T04:53:42.347 に答える
2

どのように前もって宣言しましたか?問題は、クラスではなくクラスであることにある可能性がありstd::ifstreamますtypedef

于 2010-06-03T04:46:28.750 に答える
1

一部のiostreamsクラスを前方宣言する場合は、単にを含めることができます<iosfwd>。そのヘッダーは、これらのクラスの前方宣言を提供します。

于 2010-06-03T04:51:22.727 に答える
1

のクラス定義の後にセミコロンがありませんA

于 2010-06-03T04:54:54.573 に答える
1

これをチェックして

namespace std
{
    template<class E, class T> class basic_ifstream;
    template<class E> struct char_traits;
    typedef basic_ifstream<char, char_traits<char> > ifstream;
}
于 2015-08-20T10:08:36.040 に答える
-1

次の手順を実行します (独自のヘッダー ファイルの前に std ヘッダー ファイルを既にインクルードしている場合は、前方宣言を行う必要はありません)。

あなたのcppファイルで:

#include <iostream>
#include "a.h"    

あなたのahファイルで:

using namespace std;
class A {
  ifstream *instream;

};
于 2010-06-03T05:04:47.873 に答える