用于定义全局函数"using namespace"
"using namespace" for defining global functions
在源文件中定义类成员函数时,我们可以使用using namespace ns1::ns2::...::nsx
来避免必须完全限定函数名称。
例如
// Header file - foo.hpp
namespace ns1::ns2 {
class FooClass {
void fooMethod();
}
}
// Source file - foo.cpp
#include "foo.hpp"
using namespace ns1::ns2;
void FooClass::fooMethod() {
// do something
}
但是,我最近在尝试定义全局函数时遇到了困惑。
请参阅以下示例。
// Header file - bar.hpp
namespace ns1::ns2{
void barFunction(); // <-- compile error: undefined reference
}
// Source file - bar.cpp
#include "bar.hpp"
using namespace ns1::ns2;
void barFunction(){
// do something
}
我期望编译器将bar.cpp
中的定义推导出为bar.hpp
中定义的ns1::ns2::barFunction
的定义。但它没有这样做。(如果我在定义中使用完全限定的名称,一切正常(。
这是预期的行为还是我做错了什么?
这是
预期行为。
这意味着在定义全局命名空间[命名空间.udir]
3 using-指令不会向声明性添加任何成员 它出现的区域。
时,全局命名空间中没有 barFunction
的声明。这使得该定义成为此类函数的第一个也是唯一一个声明(在全局命名空间中(。
这是设计使然,因为 using 指令通常可以引入比预期更多的名称。因此,不让它践踏它出现的声明性区域是好的。
相关文章:
- "using namespace std;"在C++的作用是什么?
- 为什么我需要做'using namespace std'而不是"使用 std::cout"?
- 'using namespace'实现细节的便捷方法(仅标头库)?
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- "using namespace"子句在什么范围内有效?
- 如何找到"using namespace std"的违规用法?
- 在实现文件中,我们应该更喜欢"using namespace"指令还是将实现包装在命名空间 { } 中?
- 如何根据对象名称将'using namespace'添加到类定义中?
- 没有任何 #include "using namespace std;"?
- 用于定义全局函数"using namespace"
- 'using namespace'如何在C++运作
- 为什么我们应该在使用"using namespace std"时使用"#include<iostream>"?
- 如何在代码中使用 STD 而不包含"using namespace std"?
- 如何正确使用"using namespace foo?"
- 使用不带前缀"std"且不带"using namespace std;"的 std::sort() 成功编译
- 总是"using namespace std" ?
- 头文件中可以包含"using namespace"语句吗?
- 为什么以及如何"using namespace"声明会混淆C++中的编译器?
- "using namespace std;"是否免于过多代码规则?
- C++如何知道在哪里查找使用 "using namespace ..." 指定的命名空间?