【C++】关于using namepace xxx 使用命名空间和冲突

官方定义

namespace是指 标识符的各种可见范围。命名空间用关键字namespace来定义。 命名空间是C++的一种机制,用来把单个标识符下的大量有逻辑联系的程序实体组合到一起。此标识符作为此组群的名字。

基本使用

编译及执行命令:

g++ test.cpp -o test
./test

以最简单的输入(cin)输出(cout)流为例:

#include
  
int main() {
    std::cout << "testing" << std::endl;
}

如果加上使用命名空间,代码则可简化为:

#include

using namespace std;

int main() {
    cout << "testing" << endl;
}

遇到的冲突问题

现在我在改EzPC(一个非常大的基于C++的隐私计算框架),希望加上armadillo库以更好地支持复杂的矩阵运算。

【C++】关于using namepace xxx 使用命名空间和冲突_第1张图片

加上这两行后,开始编译,于是出现了如下的一大堆报错:

在这里插入图片描述

【C++】关于using namepace xxx 使用命名空间和冲突_第2张图片

分析上面的报错信息,大概可以知道问题在于:armadillo库和原框架中的MathFunctions中都存在同样的math函数,导致编译过程中,编译器不知道math->ReLU这类操作调用的哪个math。所以,上面也报错说“ambiguous(含糊不清的)”。

冲突解决

我这里采用的最简单的方法解决这个命名冲突,直接不对armadillo库使用命名空间,这样就不存在“调math时不清楚是arma中的math还是原框架中另一个库的math”这个问题了。

【C++】关于using namepace xxx 使用命名空间和冲突_第3张图片

也就是说,我在代码中使用armadillo时(比如调用cube类),不能直接写成:

cube x = cube(1, 2, 3)

而应该写成完整形式:

arma::cube x = arma::cube(1, 2, 3)

测试一下,编译通过!
再测试一下armadillo能否顺利使用:

std::cout << "convert array to cube" << std::endl;
// arma::cube image = arma::cube(H, W, C);
arma::cube image = arma::cube(1, 2, 3);
std::cout << image << std::endl;

【C++】关于using namepace xxx 使用命名空间和冲突_第4张图片

没有问题,bingo

你可能感兴趣的:(C++,c++,开发语言)