名称空间,类和免费功能 - 何时需要完全合格的名称
-
28-09-2019 - |
题
在下面的示例中,为什么我必须充分限定CPP中的免费功能的名称,以避免链接器错误,为什么它在没有什么情况下可以使用?你能解释区别吗?
ctest.h:
namespace Test
{
int FreeFunction();
class CTest
{
public:
CTest();
~CTest();
};
}
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()
{}
感谢您的时间和帮助。
解决方案
int FreeFunction(void);
只是声明,而以下是一个定义。
class CTest
{
public:
CTest();
~CTest();
};
如果您想提供 definition for an already declared entity in a namespace
(例如,在封闭名称空间中)必须是完全合格的名称。
edit2:
这将使您更加清晰。请注意,在此代码中使用指令否。
namespace Test {
int FreeFunction(void); // declare
class CTest; // declare
}
int Test::FreeFunction(){return 0;} // define
class Test::CTest{ // define
};
int main(){}
编辑3:声明与定义(C ++ 0x)$ 3.1/2--
声明是一个定义 除非它声明功能而未指定功能的身体(8.4), ,它包含外部指定符(7.1.1)或链接规格25(7.5),并且既不是初始化器和函数体,它在类定义(9.4)中声明了静态数据成员(9.4), 这是一个班级名称声明(9.1), ,它是一种不透明的eNum-declaration(7.2),或者是typedef声明(7.1.3),一种使用declaration(7.3.3),static_assert-declaration(第7条),属性 - 属性(条款)(条款)(条款) 7),一个空陈述(第7条)或使用指示性(7.3.4)。
其他提示
尽管 FreeFunction
将下定决心 Test::FreeFunction
如果你 参考或称呼它 提供 using namespace Test;
线,就 定义 功能传递,编译器无法知道您是否定义 全新功能 FreeFunction
在任何名称空间之外,还是定义已经声明的 Test::FreeFunction
. 。编译器默认认为您正在定义一个全新的功能。
为了 CTest::CTest
, 但是,你已经 指 班上 Test::CTest
, ,并且由于没有类或名称空间 CTest
外面 Test
名称空间,嗯,引用 CTest::anything
是明确的。因此,它知道构造函数和驱动器的定义是指innamespace类 CTest
.
我认为这是一个很小的代价,必须写信 Test::FreeFunction
.
希望这可以帮助!
如果您不符合免费函数定义的限定,则编译器不知道要为先前向前指定的Test :: FreeFunction或当前名称空间中单独的frofunction提供实现。
另一方面,只有一种方法可以解决ctest的名称 - 作为测试名称空间的类定义。因此,无需充分限定它。
但是,如果CTEST名称分辨率是模棱两可的(例如,当前名称空间中还有另一个CTEST类),您将必须充分限定该方法声明。
在实现功能时,我发现通常最好打开名称空间。请记住,您可以重新打开它们...
// in Test.cpp
namespace Test
{
int FreeFunction()
{
return 0;
}
}