【问题标题】:Variable declaration in C++ within namespaces命名空间内的 C++ 中的变量声明
【发布时间】:2019-09-25 17:00:56
【问题描述】:

在我正在使用的库中,一些变量是这样声明的:

char &ns::x = y;

但是,如果我这样做,我会收到以下错误: error: no member named 'x' in namespace 'ns'

如果我重写它,它可以工作:

namespace ns {
    char &x = y;
}

到底有什么区别?为什么它在图书馆内工作?

【问题讨论】:

  • 您确定该库中的ns 是命名空间,而不是类名吗?

标签: c++ variables scope reference declaration


【解决方案1】:

如果你是对的并且库中的代码与编写的完全一样,那么这意味着在这个库的其他地方,你会发现以下声明:

namespace ns {
    extern char& x;
}

换句话说,x 必须已经在ns声明(并且未定义!)。

【讨论】:

    【解决方案2】:

    第一个声明

    char &ns::x = y;
    

    假定名称 x 已在命名空间 ns 中声明。然而这个假设是错误的(在提供的代码 sn-p 中没有先前的变量声明。可能代码 sn-p 不完整。)。

    只要变量 x 已经在命名空间 ns 中声明(没有定义),代码 sn-p 就可以工作。

    例如

    #include <iostream>
    
    namespace ns
    {
        extern char &x;
    }
    
    char y;
    char & ns::x = y;
    
    int main() {
        return 0;
    }
    

    在这段代码中sn-p

    namespace ns {
        char &x = y;
    }
    

    定义了一个由对象y初始化的引用。

    【讨论】:

    • 那么肯定必须在任何地方声明 x 吗?因为我在任何 cpp 和 h 文件中都没有找到。
    • @ElasticLamb 是的,变量(没有它的定义,它有一个引用的类型)应该已经声明了。
    • @VladfromMoscow 是的——交叉线。
    【解决方案3】:

    使用命名空间的变量声明:

    #include <iostream> 
    using namespace std; 
    
    // Variable created inside namespace 
    namespace first 
    { 
      int val = 500; 
    } 
    // Global variable 
    int val = 100; 
    int main() 
    { 
    // Local variable 
       int val = 200; 
    // These variables can be accessed from 
    // outside the namespace using the scope 
    // operator :: 
       cout << first::val << '\n';  
       return 0; 
    } 
    

    【讨论】:

    • 这不能回答 OP 的问题。
    猜你喜欢
    • 2012-07-19
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多