2010-06-03 3 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

+1

Вы забыли определение ';' after 'class A', для начала ... – AnT

ответ

2

Как вы это провозгласили? Проблема может заключаться в том, что std::ifstream - это typedef, а не класс.

1

Если вы хотите отправить объявить некоторые iostreams классы, вы можете просто включить <iosfwd>. Этот заголовок предоставляет передовые декларации для этих классов.

2

У вас на самом деле две проблемы.

Первым является то, что форвард, объявляющий typedef, довольно сложно в C++, как уже указывал Кирилл.

Th вторым является то, что ifstream является ЬурейиМ для конкретного шаблона экземпляра basic_ifstream - для того, чтобы компилятор, чтобы иметь возможность расширить шаблон, он должен уже иметь тело шаблона определяется, то есть вы не можете forward объявить экземпляр шаблона.

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; 
} 
Смежные вопросы