我在阅读《加速的c ++》第4章,他们在其中教授如何将c ++程序划分为不同的文件。在这里,他们写道,我们不应该在头文件中使用“ using _ :: ”构造,因为包括头文件的人可能想要使用其他实现。但是在头文件中实现方法时,可以使用“ using”。你能澄清一下吗?在链接实现目标文件时,程序最终不会使用“ using ::”构造吗?这是代码:
//median.h file
#ifndef GUARD_median_h
#define GUARD_median_h
#include <algorithm>
#include <vector>
double median(std::vector<double>); // <<<<<<<< no "using std::vector"
#endif
Run Code Online (Sandbox Code Playgroud)
但是在位数.cpp中:
#include <vector>
#include <stdexcept>
using std::vector; // <<<<< "using" construct used
using std::domain_error; // <<<<< "using" construct used
double median(vector<double> vec){
if(vec.size() == 0) throw domain_error("median for an empty vector not defined");
//....... rest of the implementation
}
Run Code Online (Sandbox Code Playgroud)
要澄清一点:
这是我的客户调用上面的标头:
#include "median.h"
using my_vector_impl::vector;
//..some function...
std::vector v1;
double med = median(v1);
Run Code Online (Sandbox Code Playgroud)
我说的对吗,我们可以防止在标头中使用“ std :: vector”,以便可以在上述代码中使用第二行?
using只是一个缩短名称的编译时快捷方式。它在运行时无效。同样,它只会影响源代码,该源代码处于或低于其自身作用域,因此,如果在实现文件中使用它,则其他文件都看不到它,但是,如果在标头中使用,则包含标头的所有文件将包含using它们,并且它们的名称空间将被污染。
编辑:
要回答更新的问题,您的示例并不十分清楚为什么应避免using在标头中使用。这就是为什么:
// Header:
using std::vector;
// Client:
#include <Header>
class vector { ... };
void f() {
vector v; // Ambiguous because of something out of my control
}
Run Code Online (Sandbox Code Playgroud)
您想避免这种情况。您不想告诉使用您的库的人可以使用哪些名称,即在使用时要使用的名称using。
| 归档时间: |
|
| 查看次数: |
3692 次 |
| 最近记录: |