我知道有许多类似的主题,但同样有许多独特的错误可能会导致这个问题(所以我认为)。因此,经过一些研究,我想问。
我的问题是编译器GNU GCC在编译一个文件时看不到我在另一个文件中声明的命名空间。 IDE(CodeBlocks)显然确实看到它,因为它自动完成命名空间的名称。我试图找出问题并提出这个问题:
文件main.cpp:
namespace MyName
{
int MyVar;
}
#include "T1.cpp"
int main()
{
return 0;
}
文件T1.cpp:
using namespace MyName;
错误:' MyName'不是名称空间名称。
在我的项目中,我有一个头文件,比如T1.h,以及一个实现文件T1.cpp - 并且MyName不能在其中任何一个中访问。
任何帮助或指导都将不胜感激。
答案 0 :(得分:0)
正在发生的事情是CodeBlocks正在编译main.cpp和T1.cpp。当您尝试编译每个时,会发生以下情况:
main.cpp中:
$ g++ main.cpp
$
T1.cpp
$ g++ T1.cpp
T1.cpp:1:17: error: ‘MyName’ is not a namespace-name
using namespace MyName;
^
T1.cpp:1:23: error: expected namespace-name before ‘;’ token
using namespace MyName;
^
$
T1.cpp,当它自己编译时,不知道MyName
。要解决此问题,请不要包含.cpp
个文件,并将声明放在头文件中。
编辑:从我收集的内容来看,这可能是组织示例的更好方法:
T1.h:
namespace MyName {
extern int MyVar;
}
T1.cpp
#include "T1.h"
int MyName::MyVar = 5;
的main.cpp
#include "T1.h"
#include <iostream>
using namespace MyName;
int main()
{
std::cout << MyVar << std::endl;
return 0;
}
现在它将正确编译:
$ g++ -c T1.cpp -o T1.o
$ g++ -c main.cpp -o main.o
$ g++ T1.o main.o
$ ./a.out
5