名称空间,类和自由函数 - 何时需要完全限定名称

nab*_*lke 8 c++ namespaces declaration definition fully-qualified-naming

在下面的示例中,为什么我必须完全限定cpp中自由函数的名称以避免链接器错误,为什么它不适用于类函数?你能解释一下这个区别吗?

ctest.h:

namespace Test
{
    int FreeFunction();

    class CTest
    {
        public:
            CTest();
            ~CTest();
    };
}
Run Code Online (Sandbox Code Playgroud)

ctest.cpp:

#include "ctest.h"

using namespace Test;

// int FreeFunction()     -> undefined reference error
int Test::FreeFunction()  -> works just fine
{
    return 0;
}

CTest::CTest()                -> no need to fully qualify name, i.e. Test::CTest
{}

CTest::~CTest()
{}
Run Code Online (Sandbox Code Playgroud)

感谢您的时间和帮助.

Chu*_*dad 12

int FreeFunction(void);  
Run Code Online (Sandbox Code Playgroud)

只是一个声明,而下面是一个定义.

class CTest 
{ 
    public: 
        CTest(); 
        ~CTest(); 
}; 
Run Code Online (Sandbox Code Playgroud)

如果要提供definition for an already declared entity in a namespace(例如在封闭的命名空间中),则必须是完全限定名称.

EDIT2:

这是一些可以让你更清晰的东西.请注意此代码中没有using指令.

namespace Test { 
    int FreeFunction(void);   // declare

    class CTest;              // declare
} 

int Test::FreeFunction(){return 0;} // define
class Test::CTest{            // define
};

int main(){}
Run Code Online (Sandbox Code Playgroud)

编辑3:声明与定义(C++ 0x)$ 3.1/2-

声明是一个定义,除非它声明一个函数而没有指定函数的主体(8.4),它包含extern说明符(7.1.1)或linkage-specification25(7.5),既不是初始化器也不是函数体,它声明了类定义中的静态数据成员(9.4),它是一个类名声明(9.1),它是一个opaque-enum-declaration(7.2),或者是一个typedef声明(7.1.3),一个using-declaration( 7.3.3),static_assert声明(第7条),属性声明(第7条),空声明(第7条)或使用指令(7.3.4).