Проблема прямого объявления C ++ - PullRequest
12 голосов
/ 03 июня 2010

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

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

Какая норма для обхода этого?

Заранее спасибо.

Ответы [ 7 ]

23 голосов
/ 03 июня 2010

Не пересылать объявление std: ifstream - просто импортируйте <iosfwd>.

ifstream - это typedef.

Подробнее см. Здесь: http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.2/group__s27__2__iosfwd.html

2 голосов
/ 03 июня 2010

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

Во-первых, объявить typedef вперёд довольно сложно в C ++, как уже указывал Кирилл.

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

2 голосов
/ 03 июня 2010

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

1 голос
/ 20 августа 2015

отметьте это

namespace std
{
    template<class E, class T> class basic_ifstream;
    template<class E> struct char_traits;
    typedef basic_ifstream<char, char_traits<char> > ifstream;
}
1 голос
/ 03 июня 2010

Вы пропустили точку с запятой после определения класса A.

1 голос
/ 03 июня 2010

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

0 голосов
/ 03 июня 2010

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

В вашем файле cpp:

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

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

using namespace std;
class A {
  ifstream *instream;

};
...