C++ 未能在my.cpp文件中正确使用命名空间
我在C++ 未能在my.cpp文件中正确使用命名空间,c++,C++,我在MYTIME.h文件中声明了一个名称空间MYTIME #include<ostream> #ifndef _TIME_H #define _TIME_H namespace MYTIME{ class time { ... }; } #endif 当我使用g++time.cpp编译时,错误如下 time.cpp:8:17: error: ‘MYTIME’ is not a namespace-name
MYTIME.h
文件中声明了一个名称空间MYTIME
#include<ostream>
#ifndef _TIME_H
#define _TIME_H
namespace MYTIME{
class time
{
...
};
}
#endif
当我使用g++time.cpp
编译时,错误如下
time.cpp:8:17: error: ‘MYTIME’ is not a namespace-name
using namespace MYTIME;
^~~~~~
time.cpp:8:23: error: expected namespace-name before ‘;’ token
using namespace MYTIME;
^
time.cpp:10:1: error: ‘time’ does not name a type
time::time()
time.cpp:31:6: error: ‘time’ is not a class, namespace, or enumeration
void time::addSec(long int s)
time.cpp: In function ‘void addSec(long int)’:
time.cpp:34:7: error: ‘seconds’ was not declared in this scope
m = (seconds + s) / 60;
^~~~~~~
time.cpp:34:7: note: suggested alternative: ‘useconds_t’
m = (seconds + s) / 60;
^~~~~~~
useconds_t
... // many same errors
我哪里做错了?如何修复它?正在寻求帮助。您的标题保护正在使用已定义的名称。因此,您的命名空间和类永远不会被声明 一个简单的测试演示了问题:
#include <iostream>
int main()
{
#ifdef _TIME_H
std::cout << "Well, well, well...\n";
#endif
}
要解决这个问题,您应该使用更具唯一性的命名头,而不要尝试使用标准库使用的命名约定。特别是,在前缀中加下划线通常不是一个好主意
如果你的编译器支持<>代码>语法>曾经是 >你可能想考虑使用它。你确信<代码> MyTime.H./C>确实被正确地包含了吗?您是否在正确的文件中写入
名称空间MYTIME
?这就是所有显示的错误吗?是的,我确信mytime.h
也包括在内,因为类time
无法正确识别,所以有很多相同的错误。以\uuu
开头的标识符是保留的,iirc。不要用一个定义来定义。关于下划线前缀,我知道它们是用C保留的,但是我不知道C++中执行这个是不是?“我一直避免使用它们,但更多的是出于习惯,”帕迪,这不是强制的;但是,它们是为编译器保留的,因此最终会导致名称冲突。我没有这个标准,但我认为它只是从\uuu
开始,尽管后面可能有一个大写字母。我不记得了。非常感谢,这确实有效,但出现了一些新错误,看起来time
会造成歧义,但是time
在名称空间MYTIME中,为什么仍然发生错误?毫无疑问,在从未编译过的新代码中会出现错误。您的任务是处理错误并修复它们。这超出了您的问题范围,您的问题是询问一个您难以诊断的特定错误。常用名称的歧义是随意导入整个名称空间的副作用。出于这个确切的原因,我个人不使用使用namespace
子句。我更喜欢将特定名称作为别名导入(使用子句或typedef
)并完全限定其他所有内容。对于CPP文件中的定义,整个类实现应该包装在名称空间MYTIME{…}
中。@Yongy vers,使用名称空间std删除代码>也会导致名称冲突。
#include <iostream>
int main()
{
#ifdef _TIME_H
std::cout << "Well, well, well...\n";
#endif
}
Well, well, well...