C ++标头实现中的“ using”关键字

kma*_*mad 3 c++ header-files

我在阅读《加速的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”,以便可以在上述代码中使用第二行?

uk4*_*321 8

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