在下面的示例中,为什么我必须充分限定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;
   }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top