加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C中的名称冲突

发布时间:2020-12-16 06:46:33 所属栏目:百科 来源:网络整理
导读:在编写一些代码时遇到了这个问题: #include iostream class random { public: random(){ std::cout "yay!! i am called n" ;} }; random r1 ; int main() { std::cout "entry!!n" ; static random r2; std::cout "done!!n" ; return 0 ; } 当我尝试编译
在编写一些代码时遇到了这个问题:

#include <iostream>

class random { public: random(){ std::cout << "yay!! i am called n" ;} };

random r1 ;

int main() { std::cout << "entry!!n" ; static random r2; std::cout << "done!!n" ; return 0 ; }

当我尝试编译此代码时,我收到错误
错误:arandoma没有命名类型.
当我为类使用一些不同的名称时,代码工作正常.
似乎随机定义在其他地方(虽然编译器消息不是很有用).

我的问题是如何确保我使用的名称不会与包含文件中使用的名称冲突.我尝试过使用命名空间,但这会在调用时导致模糊不清.
任何见解?
[编辑]
我使用命名空间作为命名空间myNSpace
但是,当我使用它作为使用myNSpace :: random时,它运行正常.

解决方法

为什么你使用命名空间…不起作用,而你的使用…工作?首先,我想通过使用详细的类型说明符向您展示另一种解决方法:

int main() {
  // ...
  static class random r2; // notice "class" here
  // ...
}

这是因为“class some_class”是一个精心设计的类型说明符,在查找指定的名称时会忽略任何非类型声明,因此全局范围内具有相同名称的POSIX函数不会隐藏类名.您尝试了另外两种方法来解决它:使用指令和使用声明:

>然后,您尝试将类型粘贴到命名空间中,并尝试使用命名空间foo;在主要 – 为什么它不起作用?

namespace foo {
class random
{
 public:
 random(){ std::cout << "yay!! i am called n" ;}
};
}

int main() {
 using namespace foo; 
 static random r2; // ambiguity!
 return 0 ;
}

您可能想知道为什么会这样,因为您可能认为using指令将foo的名称声明为main的本地范围 – 但事实并非如此.它没有声明任何名称,实际上它只是指向另一个名称空间的链接.在这种情况下,它在非限定名称查找期间使名称可见 – 但是名称作为包含using-directive和表示的名称空间(foo)的命名空间的成员可见.这个封闭的命名空间是这里的全局命名空间.

所以会发生什么是名称查找将找到该名称的两个声明 – 全局POSIX随机声明,以及foo中的类声明.声明不是在相同的范围(声明性区域)中进行的,因此函数名称不会像往常一样隐藏类名(请参阅man stat以获取示例),但结果是歧义.
>然后使用声明声明一个名称作为它出现的声明区域的成员.因此,当从main开始查找随机时,它将首先找到一个引用foo中随机声明的名称,这将是有效隐藏全局POSIX功能.以下是有效的

namespace foo {
class random
{
 public:
 random(){ std::cout << "yay!! i am called n" ;}
};
}

int main() {
 using foo::random; 
 static random r2; // works!
 return 0 ;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读