命名空间c+中的外部变量+; 我有一个关于命名空间C++中的Exchange变量的问题。这是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; }

命名空间c+中的外部变量+; 我有一个关于命名空间C++中的Exchange变量的问题。这是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; },c++,namespaces,global-variables,extern,C++,Namespaces,Global Variables,Extern,.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

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

那么区别是什么呢?

在成员函数的定义中,您在类的范围内,而类又在其周围名称空间的范围内。因此,在类或名称空间中声明的任何内容都可以访问,而无需进行限定


在名称空间之外,非限定名称不可用,这就是为什么您需要变量和函数定义中的
参数::
限定。

在成员函数的定义中,您在类的范围内,而类又在其周围名称空间的范围内。因此,在类或名称空间中声明的任何内容都可以访问,而无需进行限定

在名称空间之外,非限定名称不可用,这就是为什么您需要变量和函数定义中的
参数::
限定。

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)
    {
        ...    }
}
该类在命名空间的作用域中,因此您要实现的类的主体也在该作用域中。

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)
    {
        ...    }
}

该类在命名空间的作用域中,因此您正在实现的类的主体也在该作用域中。

@Maystro:您注释掉了
cvbr
的定义,因此链接器抱怨它没有定义。你为什么要这样做?我只是想了解其中的区别,以及它到底做了什么“parameters::CBVR parameters::CBVR”?你说的是定义?它已经在名称空间中定义了,不是吗?@Maystro:不是,它是在标题中声明(未定义)的-这就是
extern
的意思。声明声明声明它存在,但没有为它分配任何存储。它还必须在一个源文件中定义才能使用。这就是原始源文件的第一行所做的,您在更新中注释掉了。@Maystro:您注释掉了
cvbr
的定义,因此链接器抱怨它没有定义。你为什么要这样做?我只是想了解其中的区别,以及它到底做了什么“parameters::CBVR parameters::CBVR”?你说的是定义?它已经在名称空间中定义了,不是吗?@Maystro:不是,它是在标题中声明(未定义)的-这就是
extern
的意思。声明声明声明它存在,但没有为它分配任何存储。它还必须在一个源文件中定义才能使用。这就是原始源文件的第一行所做的,您在更新中注释掉了它。