ns.cpp
:C++ имен с классом
#include <iostream>
namespace ns { // want to access this globally
class A ;
}
class ns::A {
public:
int x1;
char s1[128];
};
int main()
{
int doit();
//using namespace ns;
ns::A a;
a.x1= 2;
std::cout << "pre " << a.x1 << "\n" ;
doit();
std::cout << "post " << a.x1 << "\n" ;
}
ns_call.cpp
:
namespace ns {
class A;
}
class ns::A {
public:
int x1;
char s1[];
};
using namespace ns;
int
doit()
{
extern ns::A a;
a.x1= 100;
}
в ns.cpp, класс является declard в пространстве имен. определяется класс.
Переменные в классе должны быть доступны по всему миру. Это является целью пространства имен.
ns_call.cpp затем получает доступ к 1 члену класса, x1.
2 файла были составлены в порядке с GCC 5.4.1 в Fedora 14. Выход пробег:
pre 2
post 2
Я ожидал, что 'сообщение 100', потому что я хотел получить доступ к Int x1 в классе А во всем мире.
Это не ссылка: 'неопределенная ссылка на 'a'' (она объявлена внутри' main', а не глобально). –
Это нарушение ODR - определение ns :: A' в ns_capp.cpp отличается от определения в ns.cpp. – ildjarn
Переместите «ns :: A a;» до 6 строк. Он работает тогда. –