使用名称范围

时间:2015-12-17 13:11:50

标签: c++ namespaces

我尝试了以下代码。当我编译时,我得到错误,那里有first_var的模糊实例,而我已经介绍过了  在最后一个cout之前使用名称空间second_space

我想这是因为最后一个cout正在使用这两个命名空间。命名空间没有覆盖概念?无论如何,命名空间范围可以结束,还是从使用命名空间点继续到文件末尾?

#include<iostream.h>
namespace first_space{
    int first_var;
}
namespace second_space{
    int first_var = 1;
}
int main()
{
    int first_var =1 ;
    using namespace first_space;
    cout<<"Hello World"<<endl;
    cout<<"First Namespace Variable using namespace identifier:"<<first_space::first_var<<endl;
    cout<<"First Namespace Variable using using identifier:"<<first_var<<endl;
 //   using namespace second_space;
    cout<<"Second Namespace Variable using using identifier:"<<first_var<<endl;
}

编辑1:

我在下面试过这样的话。声明在main中具有相同名称的变量,为其分配值1,然后使用下面的命名空间使用。但是我看到,first_var的值在最后两个cout中打印为1。 这里没有歧义。那么命名空间没有任何影响?为什么会这样?

Hello World
First Namespace Variable using namespace identifier:0
First Namespace Variable using using identifier:1
Second Namespace Variable using using identifier:1

输出:

module.run(function($cordovaPush) {

      var androidConfig = {
        "senderID": "replace_with_sender_id",
      };

      document.addEventListener("deviceready", function(){
        $cordovaPush.register(androidConfig).then(function(result) {
          // Success
        }, function(err) {
          // Error
        })

        $rootScope.$on('$cordovaPush:notificationReceived', function(event, notification) {
          switch(notification.event) {
            case 'registered':
              if (notification.regid.length > 0 ) {
                alert('registration ID = ' + notification.regid);
              }
              break;

            case 'message':
              // this is the actual push notification. its format depends on the data model from the push server
              alert('message = ' + notification.message + ' msgCount = ' + notification.msgcnt);
              break;

            case 'error':
              alert('GCM error = ' + notification.msg);
              break;

            default:
              alert('An unknown GCM event has occurred');
              break;
          }
        });


        // WARNING: dangerous to unregister (results in loss of tokenID)
        $cordovaPush.unregister(options).then(function(result) {
          // Success!
        }, function(err) {
          // Error
        })
      }, false);
    });

1 个答案:

答案 0 :(得分:5)

是的,你是正确的,在第二个using语句之后,变量first_var现在是不明确的,因为就name lookup而言,两个名称空间都是有效的并且具有相同的优先级

这两个解决方法是

a)添加大括号以强制执行匿名范围(live demo

{
using namespace first_space;
cout << "First Namespace Variable using using identifier:" << first_var << endl;
}

{
using namespace second_space;
cout << "Second Namespace Variable using using identifier:" << first_var << endl;
}

b)删除using关键字并直接使用命名空间范围

cout << "First Namespace Variable using using identifier:" << first_space::first_var << endl;
cout << "Second Namespace Variable using using identifier:" << second_space::first_var << endl;

我个人会选择b。首先添加名称空间的主要原因之一是避免歧义问题,因此用一堆using语句污染当前作用域会破坏这一点。