Компилятор C ++ говорит мне, что тип не распознан - PullRequest
0 голосов
/ 02 февраля 2011

Использование Visual C ++ 2010 У меня есть код, подобный следующему:

файл A.hpp:

...
#include "R.hpp"
...
class A; // forward declaration because the APtr_t is used inside the A class too.
typedef boost::shared_ptr<A> APtr_t;
...
class A {
...
    void some_method () {
       ...
       R::get()->mehod(); // singleton ;)
       ...
    }
...
};

файл R.hpp:

...
#include "A.hpp"
...

class R {
...
APtr_t method();
...
};

Редактор Visual C ++ говорит, что все в порядке (без ошибок), но при компиляции проекта он действует как APtr_t, который не был определен Это показывает ошибки как это:

error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

Дело в том, что эта проблема возникает только в файле R.hpp, я думаю ...

У вас есть идеи? Это довольно запутанно: - /

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

Ответы [ 2 ]

4 голосов
/ 02 февраля 2011

Мои навыки психической отладки предполагают, что A.hpp включает R.hpp, и что у ваших заголовков есть соответствующие охранники.В этом случае включаемая цепочка будет выглядеть как blah.cpp -> A.hpp -> R.hpp -> A.hpp (include guard prevents inclusion).Так что он никогда не видел содержимое A.hpp внутри R.hpp.Вам нужно будет использовать один из стандартных методов для удаления циклических зависимостей.

0 голосов
/ 02 февраля 2011

Я считаю, что это заголовочный файл, включающий цикл, что означает, что A включает B, B включает A. Обычно это приводит к таким проблемам. В ваших файлах cpp, независимо от того, что вы вначале включаете, в какой-либо последовательности он всегда сообщает о таких проблемах. Решение не использовать цикл включения.

Полагаю, у вас нет файлов cpp. Тогда, возможно, вы сможете ввести другой hpp-файл, type.hpp, который чисто определяет интерфейс класса, но не реализует его, тогда в A.hpp и R.hpp вы можете написать код функции-члена.

type.hpp

class A; // forward declaration because the APtr_t is used inside the A class too.
typedef boost::shared_ptr<A> APtr_t;
...
class A {
...
void some_method ();
...
};

class R {
...
APtr_t method();
...
};


a.hpp 
#include "type.hpp"
void A::some_method () {
   ...
   R::get()->mehod(); // singleton ;)
   ...
}


r.hpp
#include "type.hpp"
....    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...