2015-02-09 201 views
0

我對命名空間C++中的extern變量有疑問。這裏是CBVR類命名空間中的extern變量C++

namespace parameters 
{ 
class CBVR 
{ 
private: 

    std::string database; 

public: 

    CBVR(void); 

    void initialize(const std::string &fileName); 
    static void printParameter(const std::string &name, 
           const std::string &value); 
}; 
extern CBVR cbvr; 
} 

的.h文件.cpp文件看起來像:

parameters::CBVR parameters::cbvr; 


using namespace xercesc; 

parameters::CBVR::CBVR(void) 
{ 

} 

void parameters::CBVR::initialize(const std::string &_fileName) 
{ 

} 

void parameters::CBVR::printParameter(const std::string &_name, const std::string &_value) 
{ 
    if (_value.empty()) 
    { 
     cbvr << " -> " << _name << " = < EMPTY!!! >" << std::endl; 
    } 
    else 
    { 
     cbvr << " -> " << _name << " = \"" << _value << "\"" << std::endl; 
    } 
} 

在該方法中printParameter,我們使用cbvr沒有任何參考的命名空間。 parameters::CBVR parameters::cbvr;處理它,但我不明白這是什麼意思,爲什麼它允許cbvr變量像這樣在課堂上使用?

編輯:

我沒有這一點,但它說:error: undefined reference to parameters::cbvr

//parameters::CBVR parameters::cbvr; 
using namespace parameters; 
using namespace xercesc; 

CBVR::CBVR(void) 
{ 

} 

void CBVR::initialize(const std::string &_fileName) 
{ 

} 

void CBVR::printParameter(const std::string &_name, const std::string &_value) 
{ 
    if (_value.empty()) 
    { 
     cbvr << " -> " << _name << " = < EMPTY!!! >" << std::endl; 
    } 
    else 
    { 
     cbvr << " -> " << _name << " = \"" << _value << "\"" << std::endl; 
    } 
} 

有啥區別?

回答

3

在成員函數的定義中,您處於該類的範圍內,而該範圍又位於其周圍名稱空間的範圍內。因此,在類或名稱空間中聲明的任何內容都可以在沒有限定的情況下訪問。

在名稱空間之外,不合格的名稱不可用,這就是爲什麼您需要在變量和函數定義中使用parameters::限定。

+0

@編輯的問題。 – Maystro 2015-02-09 16:14:11

+1

@Maystro:您評論了'cvbr'的定義,因此鏈接器抱怨說它沒有被定義。爲什麼要這麼做? – 2015-02-09 16:15:36

+0

我只是想了解它的差別和它究竟做了什麼「parameters :: CBVR parameters :: cbvr」?你說的定義?它已經在命名空間中定義了,不是嗎? – Maystro 2015-02-09 16:25:56

1

void parameters::CBVR::printParameter(const std::string &_name, const std::string &_value) 
{ 
    ... } 

namespace parameters 
{// notice, the signature of the method has no "parameters" before CBVR 
    void CBVR::printParameter(const std::string &_name, const std::string &_value) 
    { 
     ... } 
} 

類是在命名空間的範圍,因此要實現的類的主體是範圍也相同。