2009-12-19 3 views
0
//portl.cpp 
namespace FAWN { 
namespace Sys{ 

class PortListner { 

.... 
Connecter::ConPtr _cur_con; - the main problem is here 

...C++ пространств имен trobles

//con.cpp 
namespace FAWN { 
namespace Sys { 

class Connecter { 

..... 
public: 

typedef boost::shared_ptr<Connecter> ConPtr; 

...

Кроме того, файл portl.cpp входит в какой-либо другой "основной" источниковедение файла. И этот файл «other-main» также содержит con.cpp. Поэтому, если я включу con.cpp в portl.cpp - я дважды определяю Connecter (в portl и main). Если я его не включаю, компилятор не знает, что означает Connecter :: ConPtr (или FAWN :: sys :: Connecter :: ConPtr) и пытается использовать его в качестве ограничения метода.

+1

Вы включая '.cpp' файлы в других' .cpp' файлов? У вас есть файлы заголовков? Кроме того, каковы фактические ошибки? – GManNickG

+0

Попробуйте приложить больше усилий в свой вопрос в следующий раз (или, что еще лучше, вы можете отредактировать его). Используйте кнопку «Код» для форматирования кода, а не «Цитата», даже если английский не является вашим первым языком, старайтесь объяснить себя как можно лучше; прямо сейчас ваш вопрос нелегко понять. –

+0

Лучше так? –

ответ

2

Положите class Connecter (который вы, вероятно, следует переименовать в Connector) в файл заголовка (.h вместо .cpp) и добавьте включают охрану в файл. То есть, в начале файла con.h, добавить строки

#ifndef CON_H_INCLUDED 
#define CON_H_INCLUDED 

и в самом конце, добавьте строку

#endif 

Таким образом, даже если вы #includecon.h дважды, второй раз, когда он не будет прочитан, потому что символ CON_H_INCLUDED был определен в первый раз, так что пара #ifndef-#endif скрывает содержимое.

Это обычный способ в C++: поместить объявления классов в файлы .h, которые получают #include d в файлах .cpp, которые тогда фактически определяют функции.

+0

Я уже раскалывал свои источники в определение и уклонение (я надеюсь, что это называется так на английском языке). Основная проблема заключается в том, что мне НЕОБХОДИМО включить его в portlistner.h - или он не найдет Connector (спасибо ... я изменюсь) как класс вообще. И говорит мне, что Connector не является базой имен или классом. –

+0

Добавили ли вы включенные охранники? Поскольку после добавления их вы можете включить 'con.h' в свой' portl.cpp' (или это, вероятно, 'portl.h', если вы разделили объявления), не имея двойного определения, даже если вы позже включите' con .h' снова в файле, в который вы включили 'portl.h'. – JaakkoK

+0

Я писал длинный комментарий, полный благодарности, но интернет отключился, и хотя он прочь .. Спасибо за jk, Игорь Зевака и goldPseudo. –

1

Вот как это должно выглядеть:

#ifndef PORTAL_H 
#define PORTAL_H 
#include "con.h" 
//portl.h 
namespace FAWN { 
namespace Sys{ 

    class PortListner { 

.... 
    //might need to specify Connector's namespace fully here 
    FAWN::Sys::Connecter::ConPtr _cur_con; 
... 
    }; 
} 
#endif //PORTAL_H 

//con.h 
#ifndef CON_H 
#define CON_H 
namespace FAWN { 
namespace Sys { 

    class Connecter { 

    ..... 
    public: 

    typedef boost::shared_ptr<Connecter> ConPtr; 

    }; 
} 
#endif //CON_H 
Смежные вопросы