Ответ 1
Не пересылайте объявить std: ifstream - просто импортируйте <iosfwd>
.
ifstream - это typedef.
См. здесь для получения дополнительной информации: http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.2/group__s27__2__iosfwd.html
У меня есть заголовочный файл с несколькими объявлениями вперед, но когда я включаю заголовочный файл в файл реализации, он включается после включений для предыдущих форвардных объявлений, и это приводит к ошибке вроде этого.
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
Какова норма для работы над этим?
Спасибо заранее.
Не пересылайте объявить std: ifstream - просто импортируйте <iosfwd>
.
ifstream - это typedef.
См. здесь для получения дополнительной информации: http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.2/group__s27__2__iosfwd.html
Как вы прокомментировали это? Проблема может заключаться в том, что std::ifstream
является typedef
, а не классом.
У вас на самом деле две проблемы.
Первое заключается в том, что forward, объявляющий typedef, довольно сложно в С++, как уже указывал Кирилл.
Вторым является то, что ifstream
является typedef для конкретного экземпляра шаблона basic_ifstream
- для того, чтобы компилятор мог расширять шаблон, он должен уже иметь тело шаблона, что означает, что вы не может перенаправлять объявление созданного шаблона.
Если вы хотите переслать объявление некоторых классов iostreams, вы можете просто включить <iosfwd>
. Этот заголовок предоставляет декларации для этих классов.
Вам не хватает точки с запятой после определения класса A
.
проверьте это
namespace std
{
template<class E, class T> class basic_ifstream;
template<class E> struct char_traits;
typedef basic_ifstream<char, char_traits<char> > ifstream;
}
Сделайте следующее (если у вас уже есть файл заголовка std перед вашим, нет необходимости пересылать объявление больше):
В файле cpp:
#include <iostream>
#include "a.h"
В вашем файле a.h:
using namespace std;
class A {
ifstream *instream;
};