Подтвердить что ты не робот

Проблема с прямой декларацией С++

У меня есть заголовочный файл с несколькими объявлениями вперед, но когда я включаю заголовочный файл в файл реализации, он включается после включений для предыдущих форвардных объявлений, и это приводит к ошибке вроде этого.

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

Какова норма для работы над этим?

Спасибо заранее.

4b9b3361

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

Вам не хватает точки с запятой после определения класса A.

Ответ 6

проверьте это

namespace std
{
    template<class E, class T> class basic_ifstream;
    template<class E> struct char_traits;
    typedef basic_ifstream<char, char_traits<char> > ifstream;
}

Ответ 7

Сделайте следующее (если у вас уже есть файл заголовка std перед вашим, нет необходимости пересылать объявление больше):

В файле cpp:

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

В вашем файле a.h:

using namespace std;
class A {
  ifstream *instream;

};