命名空间c ++中的extern变量

时间:2015-02-09 15:48:58

标签: c++ namespaces global-variables extern

我对命名空间c ++中的extern变量有疑问。这是CBVR类的.h文件

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

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

那有什么区别?

2 个答案:

答案 0 :(得分:3)

在成员函数的定义中,您处于类的范围内,而该范围又在其周围的命名空间的范围内。因此,可以在没有限定条件的情况下访问类或命名空间中声明的任何内容。

在命名空间之外,不合格的名称不可用,这就是您需要在变量和函数定义中进行parameters::限定的原因。

答案 1 :(得分: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)
    {
        ...    }
}

该类位于命名空间的范围内,因此您正在实现的类的主体也在范围内。