C中的名称冲突
在编写一些代码时遇到了这个问题:
#include <iostream> 当我尝试编译此代码时,我收到错误 我的问题是如何确保我使用的名称不会与包含文件中使用的名称冲突.我尝试过使用命名空间,但这会在调用时导致模糊不清. 解决方法
为什么你使用命名空间…不起作用,而你的使用…工作?首先,我想通过使用详细的类型说明符向您展示另一种解决方法:
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以获取示例),但结果是歧义. namespace foo { class random { public: random(){ std::cout << "yay!! i am called n" ;} }; } int main() { using foo::random; static random r2; // works! return 0 ; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |