2010-06-03 134 views
11

我有一个头文件有一些前向声明,但是当我将头文件包含在实现文件中时,它会包含在前面的前向声明的包含之后,并且会导致类似的错误。C++前向声明问题

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 

什么是解决这个问题的标准?

在此先感谢。

+0

你可以发布一些最小的代码? – Naveen 2010-06-03 04:48:06

+1

您在类A的定义之后忘了';',对于初学者... – AnT 2010-06-03 05:00:41

回答

2

你是如何宣布它的?问题可能在于std::ifstreamtypedef而不是类。

1

如果你要转发声明一些输入输出流类,你可以简单地包括<iosfwd>。该标题为这些类提供了前向声明。

2

你实际上有两个问题。如基里尔已经指出的那样,第一个是在C++中前向声明typedef是相当困难的。

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

1

您在类定义为A后错过了分号。

-1

执行以下操作(如果你已经包含的std头文件之前,你自己的,没有必要转发申报了):

在你的CPP文件:

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

在你呀文件:

using namespace std; 
class A { 
    ifstream *instream; 

}; 
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; 
}