隐式“使用命名空间std”而不在源代码中编写它

时间:2016-11-24 15:01:23

标签: c++ compilation namespaces

我的C ++代码在没有任何名称空间限定的情况下使用endlvectorcomplexcout 偶尔。使用GCC 4.9进行编译时,我会收到类似这样的错误:

bfm.h:454:4: error: 'complex' does not name a type
    complex<double> inner(Fermion_t x,Fermion_t y);
    ^

在同一个文件中,有一行std::限定符:

std::complex<Float>   dot(Fermion_t x_t, Fermion_t y_t,int sx,int sy);

在整个代码库中,我看到了以下使用的模板专业化

  • std::complex<double>
  • std::complex<cFloat>
  • complex<Float>
  • complex<double>
  • complex<T>
  • complex<S>

对于常规快递struct\s+complexclass\s+complex都没有设法在代码库或基础库的代码库中找到一些东西。因此我假设它确实是标准库复杂类型。

在各种标头文件中分散了几个using namespace std,但并非所有文件都散布在其中。

我尝试用GCC 4.9和Clang 3.7编译这个代码库。两者都给出了关于缺失类型的类似错误。是否有可能这与旧版GCC一起使用?我试图在所有需要的位置插入std::,但如果我不能编译适用于此类计算机的源检出,我会觉得我做错了。

1 个答案:

答案 0 :(得分:1)

您可以使用有选择性的using... declarationstype aliasing来仅引入您需要的std::成员。像:

using std::complex; 
using std::cout;
using std::endl;

cout << "Hello world" << endl; // works
complex<float> x; // works

fstream y; // compile error, no namespace qualification, no using declaration
std::fstream z; // OK

啊,是的,也许不那么明显,所以也许值得一提。你现在std::endl?嗯,它是一个流操纵器,实际上是一个功能。 这意味着也可以从其他名称空间引入当前的块 function 成员。

像:

#include <cmath>
#include <cstdlib>
inline void dummy(float x) {
  float y=fabs(x); // Na'a.., fabs is imported into std namespace by <cmath>

  using std::itoa; // same is itoa, but we'll be using it
  char buff[128];
  itoa(42, buff, 10); // OK
}