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