我的编译器找不到我定义的命名空间。我有四个文件和3个命名空间。
charon.cpp
chin.cpp
chout.cpp
的main.cpp
我的命名空间是 charon , 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: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文件中放置类不是标准的事情,但我知道可以这样做,这就是我选择尝试的原因。
我看不出我犯了什么错误。任何帮助将不胜感激。
答案 0 :(得分:8)
您需要在using directive
之前包含声明命名空间(或再次声明)的头文件:
// using namespace test; // Error test is not known to be a namespace
namespace test {}
using namespace test; // Fine -- test is known
正如Wayne正确地points out,您可能希望以不同方式重构代码,包括将包含声明的头文件,并且可以包含在不同的翻译单元中。
答案 1 :(得分: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();
};
}
答案 2 :(得分:0)
警惕循环依赖,因为它们也会导致编译器找不到您需要的命名空间。
//In rightWing.h
include "leftWing.h"
// code
//In leftWing.h
include "rightWing.h"
// code