2012-04-11 54 views
3

我的編譯器找不到我定義的名稱空間。我有四個文件和三個命名空間。編譯器找不到的名稱空間

charon.cpp

chin.cpp

chout.cpp

的main.cpp

我的命名空間戎,charon_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: In constructor ‘charon::charon_::charon_()’: 
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: 
    charon_(); 
    charon_(const charon_& orig); 
    ~charon_(); 
    }; 

    charon_::charon_(){ 
    input_thread = new boost::thread(&chin_::refresh, engine_input); 
    output_thread = new boost::thread(&chout_::refresh, engine_output); 
    } 


}; 

chin.cpp

/* 
* File: chin.cpp 
* Author: josh 
* 
* Created on 08 April 2012, 10:00 
*/ 
#include <iostream> 
#include <borland/conio.h> 
#include <ncurses.h> 
#include <deque> 
#include <boost/thread.hpp> 

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

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(); 
    }; 

    chin_::chin_(const charon_& handle) { 
    engine = handle; 
    pause = false; 
    } 
    chin_::chin_(const chin_& orig) { 
    } 
    chin_::~chin_() { 
    } 

    inline iostream chin_::grab(){ 
    iostream ret; 
    ret << getch(); 
    return ret; 
    } 
    void chin_::refresh(){ 
    while((kbhit() != 0) && (key_queue.size() < 10)) 
    { 
     char t = getch(); 
     key_queue.push_back(t); 
    } 
    } 
    bool chin_::stop_check(){ 
    return pause; 
    } 
}; 

所以這是代碼,我已經三重檢查一切。我甚至可以在netbean的類瀏覽器中看到命名空間。所以我101%確定我正確地聲明瞭名稱空間,實際上我把它們全部作爲一個名稱空間,但我認爲這是問題,所以我將它們分開。

我還沒有編碼年,但我已經打了很多書和互聯網。從我讀過的內容中,我不僅正確地聲明瞭我的名稱空間,而且還正確地使用了這些語句。再加上我發現的一切都表明,我應該能夠在不同文件之間使用相同的名稱空間。

所以我相信我在某個地方犯了一些錯誤,否則這會起作用;但據我所知,我一無所得。任何幫助,將不勝感激。

回答

5

您需要using directive之前,包括聲明命名空間中的頭文件(或再次聲明):

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

韋恩正確points out,你可能想以不同的方式調整你的代碼,包括頭文件將包含聲明並可以包含在不同的翻譯單元中。

+0

非常感謝 – 2012-04-12 17:05:18

3

您在.cpp文件中有類聲明和definitons。您需要將類聲明移至.h文件,並將其包含在使用該類的相應文件中。

例如,將以下內容移至chin.h,並在chron.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(); 
    }; 
} 
+0

哦,謝謝。我一直希望避免這樣做,但現在肯定有道理,爲什麼它不工作。 – 2012-04-12 17:12:17

相關問題