Объявление переменной в C ++ в пространствах имен - PullRequest
0 голосов
/ 25 сентября 2019

В библиотеке, с которой я работаю, некоторые переменные объявляются так:

char &ns::x = y;

Однако, если я делаю это таким образом, я получаю следующую ошибку: error: no member named 'x' in namespace 'ns'

ЕслиЯ переписываю, все работает:

namespace ns {
    char &x = y;
}

В чем именно разница?И почему это работает в библиотеке?

Ответы [ 3 ]

3 голосов
/ 25 сентября 2019

Если вы правы, а код из библиотеки в точности такой, как написано, то это подразумевает, что в других местах этой библиотеки вы найдете следующее объявление:

namespace ns {
    extern char& x;
}

Другими словами, x должно быть уже объявлено (и не определено!) Внутри ns.

1 голос
/ 25 сентября 2019

Первое объявление

char &ns::x = y;

предполагает, что имя x уже объявлено в пространстве имен ns.Однако это предположение неверно (в предоставленном фрагменте кода нет предыдущего объявления переменной. Возможно, фрагмент кода не завершен.).

Фрагмент кода может работать при условии, что переменная x уже объявлена ​​(без определения) в пространстве имен ns.

Например,

#include <iostream>

namespace ns
{
    extern char &x;
}

char y;
char & ns::x = y;

int main() {
    return 0;
}

В этом фрагменте кода

namespace ns {
    char &x = y;
}

определена ссылка, которая инициализируется объектомy.

0 голосов
/ 25 сентября 2019

Объявление переменной с использованием пространства имен:

#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; 
} 
...