C ++ пространства имен тройки - PullRequest
0 голосов
/ 20 декабря 2009
//portl.cpp
namespace FAWN {
namespace Sys{

class PortListner {

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

...

//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), и пытается использовать его как определение метода.

Ответы [ 2 ]

2 голосов
/ 20 декабря 2009

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

#ifndef CON_H_INCLUDED
#define CON_H_INCLUDED

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

#endif

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

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

1 голос
/ 20 декабря 2009

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

#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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...