C ++命名空间错误:不是命名空间的成员

时间:2017-02-05 09:58:04

标签: c++

我对c ++相对较新,目前面临下述问题。请提供您的输入,以便更好地理解命名空间并解决此问题。

我已经在名称空间中将一个变量声明为头文件中的extern,例如a.h我在.cpp文件中包含此文件,说a.cpp并在同一名称空间中定义该变量。这很好用。 现在,我将此头文件包含在另一个.cpp文件中,例如b.cpp,并在另一个命名空间中使用此变量。这让我想到了变量' a'未在此范围内声明。我使用' using namespace'来包含命名空间。在b.cpp文件中。我仍然得到同样的错误。在b.cpp中使用表达式namespace :: variable会出现错误,即变量' a'不是该命名空间的成员。

以下是了解我的问题的代码段。

// a.h
namespace example1
{ 
extern int a; 
}
// a.cpp
#include"a.h"
namespace example1
{ 
a = 10; 
}
// b.cpp
#include"a.h"
namespace example2
{ 
a = 5; // error : 'a' not declared in this scope. 
}
// b.cpp
#include"a.h"
using namespace example1;
namespace example2
{ 
a = 5; // error : 'a' not declared in this scope. 
}
// b.cpp
#include"a.h"
namespace example2
{ 
example1::a = 5; // error : 'a' not a member of example1. 
}

提前致谢。

此致 KARTHIK

1 个答案:

答案 0 :(得分:0)

在a.h中你将变量声明为extern,因此定义必须出现在cpp文件中(翻译单元才是正确的):

 // a.h
 namespace example1
 { 
     extern int a; 
 }

所以这里是你定义变量的文件:

 // a.cpp
 #include"a.h"
 namespace example1
 { 
    int a = 10; 
 }

现在使用a.cpp中定义的变量a

// b.cpp
#include"a.h"
namespace example2
{ 
   void f(){
    a = 5; // error : 'a' not declared in this scope. 
   }
}

实际上,a在名称空间example1中,a不是限定名称,编译器失败。 (编译器查找名称空间:: example2,其父名称为全局名称空间)

第二个例子:

 // b.cpp
 #include"a.h"
 using namespace example1;
 namespace example2
 { 
   void f(){
     a = 5; 
   }
 }

这应该编译,因为现在a在全局命名空间范围内可见。 但是,如果您现在仍然看到错误,它将处于链接阶段。在构建可执行文件之前,链接器将查找a的定义,因此您还必须向他提供编译a.cpp的结果。例如,如果使用GCC,请使用此命令行c++ b.cpp a.cpp进行编译。

这也适用于此示例:

  // b.cpp
 #include"a.h"
 namespace example2
 { 
    void f(){
       example1::a = 5; 
    }
 }

在这里执行限定名称查找,因此应该编译。如果发生错误,则应该在链接时,如上例所述。