其他分享
首页 > 其他分享> > c – 为什么某些函数不在std命名空间中?

c – 为什么某些函数不在std命名空间中?

作者:互联网

我正在开发一个适用于多种算术类型的项目.所以我制作了一个标题,其中定义了用户定义的算术类型的最低要求:

user_defined_arithmetic.h:

typedef double ArithmeticF;   // The user chooses what type he 
                              // wants to use to represent a real number

namespace arithmetic          // and defines the functions related to that type
{

const ArithmeticF sin(const ArithmeticF& x);
const ArithmeticF cos(const ArithmeticF& x);
const ArithmeticF tan(const ArithmeticF& x);
...
}

令我不安的是,当我使用这样的代码时:

#include "user_defined_arithmetic.h"

void some_function()
{
    using namespace arithmetic;
    ArithmeticF lala(3);
    sin(lala);
}

我收到编译器错误:

error: call of overloaded 'sin(ArithmeticF&)' is ambiguous
candidates are:
double sin(double)
const ArithmeticF arithmetic::sin(const ArithmeticF&)

我从未使用过< math.h>标题,只有< cmath>.我从未在头文件中使用using namespace std.

我正在使用gcc 4.6.*.我检查了含有模糊声明的标题是什么,结果证明是:

mathcalls.h:

Prototype declarations for math functions; helper file for <math.h>.
...

我知道,那< cmath>包括< math.h>,但它应该屏蔽std命名空间的声明.我深入研究了< cmath>标题并找到:

cmath.h:

...

#include <math.h>

...

// Get rid of those macros defined in <math.h> in lieu of real functions.
#undef abs
#undef div
#undef acos
...

namespace std _GLIBCXX_VISIBILITY(default)
{
...

因此命名空间std在#include< math.h>之后开始.这里有什么问题,还是我误解了什么?

解决方法:

允许C标准库的实现在全局命名空间和std中声明C库函数.有人会称这是一个错误,因为(正如你所发现的)命名空间污染可能会导致与你自己的名字发生冲突.但是,就是这样,所以我们必须忍受它.你只需要将你的名字限定为arithmetic :: sin.

用标准的话来说(C 11 17.6.1.2/4):

In the C++ standard library, however, the declarations (except for
names which are defined as macros in C) are within namespace scope (3.3.6) of the namespace std. It is
unspecified whether these names are first declared within the global namespace scope
and are then injected
into namespace std by explicit using-declarations (7.3.3).

标签:c,namespaces,cmath
来源: https://codeday.me/bug/20190923/1813467.html