2011-02-01 3 views
0

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

файла 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, я думаю ...

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

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

+4

Я предполагаю, что линия 'метод APtr_t():' заканчивается точкой с запятой, а не полный двоеточие? – templatetypedef

+2

Вам нужно разместить больше кода - желательно весь заголовок. – Puppy

+1

'shared_pointer', я беру, это опечатка в вопросе и' shared_ptr' в фактическом коде. Во всяком случае, попробуйте уменьшить его до наименьшего фрагмента кода, который воспроизводит проблему. Многие вещи могут быть ошибочными в тех '.....' там, которые могут запутать компилятор. (Также 'APtr_t method():', вероятно, 'APtr_t method();'?) –

ответ

4

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

+0

Я думал о том, что было в то время, но я не знаю, как его решить. Каждый файл имеет следующую структуру: #ifndef ФАЙЛ #define FILE ... code ... #endif Итак, как его решить? – Danikaze

+0

@ Danikaze: Из всего, что показано, «R.hpp» не нужно включать «A.hpp ", и вместо этого он может просто сделать с typedef с объявленным вперед' A' (который может поступать из отдельного заголовка). – UncleBens

+0

, кстати, я попытался заменить «#ifndef ...» на «#pragma once» но это не сработало :( – Danikaze

0

Я считаю, что это заголовочные файлы включают в себя цикл, который означает, что A include 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" 
....