7

我有几个文件,在下面列出,我在其中定义了一些命名空间和类。然后在其中一个文件中,我试图合并其他文件中的类。问题是编译器似乎无法找到我的命名空间。

charon.cpp

chin.cpp

chout.cpp

主文件

我的命名空间是charoncharon_incharon_out。主要问题出现在特定文件charon.cpp 上,所以这里也是该文件和chin.cpp

错误:

g++    -c -g -MMD -MP -MF build/Debug/GNU-Linux-x86/sys/charon.o.d -o build/Debug/GNU-Linux-x86/sys/charon.o sys/charon.cpp
sys/charon.cpp:6:17: error: ‘charon_in’ is not a namespace-name
sys/charon.cpp:6:26: error: expected namespace-name before ‘;’ token
sys/charon.cpp:7:17: error: ‘charon_out’ is not a namespace-name
sys/charon.cpp:7:27: error: expected namespace-name before ‘;’ token
sys/charon.cpp:15:5: error: ‘chout_’ does not name a type
sys/charon.cpp:16:5: error: ‘chin_’ does not name a type
sys/charon.cpp:31:39: error: ‘chin_’ has not been declared
sys/charon.cpp:31:55: error: ‘engine_input’ was not declared in this scope
sys/charon.cpp:32:40: error: ‘chout_’ has not been declared
sys/charon.cpp:32:57: error: ‘engine_output’ was not declared in this scope

charon.cpp

#include <iostream>
#include <boost/thread.hpp>
#include <boost/date_time.hpp>

using namespace std;
using namespace charon_in;
using namespace charon_out;

namespace charon
{
  class charon_
  {
  private:
    chout_ engine_output;
    chin_ engine_input;
    boost::thread input_thread;
    boost::thread output_thread;
    void start_threads();
    void stop_threads();
  public:
    //Methods
};

chin.cpp

#include <iostream>
#include <borland/conio.h>
#include <ncurses.h>
#include <boost/thread.hpp>

using namespace std;
using namespace charon;
using namespace charon_out;

namespace charon_in
{
  class chin_
  {
  private:
    bool pause;
    charon_* engine;
    inline iostream grab();
  public:
    //Methods
};

我检查了一切。所以我非常有信心语法是正确的,但显然我错过了一些关键概念,否则编译器不会抱怨。

(我知道将类放在 cpp 文件中并不是一件标准的事情,但我知道这样做是可能的,所以这就是我选择尝试的原因。)

我看不出我犯了什么错误。任何帮助,将不胜感激。

4

3 回答 3

17

您需要在以下内容之前包含声明命名空间(或再次声明)的头文件using directive

// using namespace test;  // Error test is not known to be a namespace
namespace test {}
using namespace test;     // Fine -- test is known

正如韦恩正确指出的那样,您可能希望以不同的方式重组代码,包括包含声明并且可以包含在不同翻译单元中的头文件。

于 2012-04-11T19:19:57.540 回答
4

您在 .cpp 文件中有类声明和定义。您需要将类声明移动到 .h 文件中,并将其包含在使用该类的适当文件中。

例如,将以下内容移至 chin.h 并将 chin.h 包含在 charon.cpp 中。

namespace charon_in 
{ 

  class chin_ 
  { 
  private: 
    bool pause; 

    iostream key_sequence; 
    deque<char> key_queue; 
    charon_* engine; 

    inline iostream grab(); 


  public: 
    chin_(const charon_& handle); 
    chin_(const chin_& orig); 
    ~chin_(); 

    void refresh(); 
    bool stop_check(); 
  }; 
}
于 2012-04-11T19:19:48.287 回答
1

警惕循环依赖,因为它们也可能导致编译器找不到您需要的命名空间。

     //In rightWing.h
     include "leftWing.h"
     // code

       //In leftWing.h
     include "rightWing.h"
     // code
于 2021-03-14T12:21:01.723 回答