2010-06-03 130 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; 
}