7

すぐ下にリストされているいくつかのファイルがあり、そこでいくつかの名前空間とクラスを定義しています。次に、ファイルの1つに、他のクラスからクラスを取り込もうとしています。問題は、コンパイラが名前空間を見つけられないように見えることです。

カロン.cpp

あご.cpp

chout.cpp

main.cpp

私の名前空間はcharoncharon_in、およびcharon_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

カロン.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
};

あご.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

Wayne が正しく指摘しているように、宣言を含み、異なる翻訳単位に含めることができるヘッダー ファイルを含めて、おそらくコードを別の方法で再構築する必要があります。

于 2012-04-11T19:19:57.540 に答える
4

.cpp ファイルにクラス宣言と定義があります。クラス宣言を .h ファイルに移動し、クラスを使用している適切なファイルに含める必要があります。

たとえば、以下を chin.h に移動し、charon.cpp に chin.h を含めます。

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 に答える