1 #include <iostream>
2
3 namespace primerlib {
4 void compute() { std::cout << "primerlib::print()" << std:: endl; }
5 void compute(const void *p) { std::cout << "primerlib::print(const void *p)" << std:: endl; }
6 }
7
8 //using primerlib::compute;
9 //using namespace primerlib;
10 void compute(int a) { std::cout << "::compute(int)" << std:: endl; }
11 void compute(double d, double dd=3.4) { std::cout << "primerlib::compute(d, d)" << std:: endl; }
12 void compute(char* p, char* p1 = 0) { std::cout << "primerlib::compute(char*, char*)" << std:: endl; }
13
14 int main(void)
15 {
16 using primerlib::compute;
17 //using namespace primerlib;
18 compute(0);
19 return 0;
20 }
Run Code Online (Sandbox Code Playgroud)
输出:
primerlib::print(const void *p)
我的问题是为什么它没有调用全局计算(int)?如果我在第17行使用using指令,它将调用compute(int).非常感谢您的帮助.
使用primerlib::compute;
这是一份using
声明。当你使用它时,就好像在 using 声明的位置声明了一个名称。foo
您可以通过添加using ::foo;
(或在全局范围内调用它)来恢复全局::foo(0);
,您将::compute(int)
在输出中看到。
事实上,在您的示例中,编译器没有找到全局foo
声明,因为这就是名称查找的工作方式 - 它搜索封闭范围,并在找到名称后停止。
有关使用声明的更多参考,请参阅:http://en.cppreference.com/w/cpp/language/namespace#Using-declarations
[编辑]
我误解了你的问题,在第 17 行你有“using 指令”,它的行为与 不同using declaration
,它不会在最近的封闭声明区域中引入名称(在你的情况下是它的主要功能),而是将名称添加到最近的封闭命名空间 - 在此转换中它是全局命名空间。更多参考:http://en.cppreference.com/w/cpp/language/namespace#Using-directives:
仅在命名空间范围和块范围中允许使用指令。从 using-directive 之后的任何名称的非限定名称查找的角度来看,直到它出现的范围结束为止,namespace-name 中的每个名称都是可见的,就好像它是在最近的封闭命名空间中声明的一样,该命名空间包含两者using 指令和命名空间名称。
using 指令不会将任何名称添加到它出现的声明区域(与 using 声明不同),因此不会阻止声明相同的名称。