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 是一个类型定义。

有关详细信息,请参见此处:http: //gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.2/group__s27__2__iosfwd.html

于 2010-06-03T04:49:07.973 回答
2

你是如何转发声明的?问题可能在于这std::ifstream是一个typedef而不是一个类。

于 2010-06-03T04:46:28.750 回答
2

你实际上有两个问题。

首先,正如 Kirill 已经指出的那样,在 C++ 中前向声明 typedef 相当困难。

第二个是ifstream特定模板实例化的 typedef basic_ifstream- 为了让编译器能够扩展模板,它必须已经定义了模板的主体,这意味着您不能转发声明实例化的模板。

于 2010-06-03T04:53:42.347 回答
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 回答