c++ - 从另一个命名空间访问标准命名空间数据成员

标签 c++ c++11 cmake namespaces

如果代码这样写:

#include<iostream>

namespace n2    {
    int y = 10;
}

namespace n1    {
    int x =  20;
    int m = ::n2::y;

    std::string str;
}

int main()
{
    std::cout << n1::x << std::endl;
    std::cout << n2::y << std::endl;

    return 0;
}

那么我的问题是,如果我没有使用语句,

using namespace std

然后我必须手动提及数据成员以及命名空间作为 std::string(例如),但是如果我在另一个命名空间内使用相同的数据成员(std::string),例如命名空间n1,那么它不会被隐式更改为命名空间n1::std::string吗?

  1. 没有 n1::std::string 数据类型,那么它是如何工作的。 n1::std::string 如何转换为::std::string?

  2. 但为什么它仍然远离另一个 namespace 内的相对使用。 如果我想在我的代码中使用该概念,我该如何更改代码。 如果将相同的概念用于我自己的库,我该如何进行更改,以利用相同的概念。

最佳答案

i1::i2 中,i1 是一个非限定标识符,它与任何其他非限定标识符一样被查找。首先在当前范围内,然后在封闭范围内,直到搜索到全局命名空间。于是用std::string因为n1中没有std,所以找到全局命名空间下的std .换句话说,在 n1 中,你可以将 ::n2::y 引用为 n2::y 只要你没有n1 中名为 n2 的实体。

如果你想防止 n1::std::string 实体,你必须使用 ::std::string 而不是 std::string.

关于c++ - 从另一个命名空间访问标准命名空间数据成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48340250/

相关文章:

c++字符串常量和静态初始化顺序惨败

c++ - 嵌入式 C++11 代码——我需要 volatile 吗?

cmake - 在 CMake 中计算实数

c++ - 成员函数到友元函数的转换

c++ - 使用迭代器作为参数重载 << 运算符

c++ - 修复警告 "comparison is always false due to limited range of data type [-Wtype-limits]"

c++ - 来自 cppreference.com 的模板参数特化示例不起作用

cmake - 如何从 pbuilder env debian/rules 脚本中使用 cmake 的 'make install'?

c++ - CMake:有没有办法将选项传递给 g++ 但不传递给 nvcc

c++ - 如何以类似于 C 函数的方式将 dlsym 映射到非静态 C++ 成员函数?