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