繁体   English   中英

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

[英]namespaces, classes and free functions - when do you need fully qualified names

在下面的示例中,为什么我必须完全限定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提供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(){}

编辑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声明( 7.3.3),static_assert声明(第7条),属性声明(第7条),空声明(第7条)或使用指令(7.3.4)。

FreeFunction将解析为Test::FreeFunction如果你引用它或在提供using namespace Test;调用它 using namespace Test; 直到定义函数,编译器无法知道你是否在任何命名空间之外定义一个全新的 FreeFunction 函数 ,或者你是否定义了已经声明的Test::FreeFunction 编译器默认认为您正在定义一个全新的函数。

但是,对于CTest::CTest ,您已经引用了类Test::CTest ,并且由于Test命名空间之外没有类或命名空间CTest ,所以对CTest::anything的引用是明确的。 所以它知道构造函数和析构函数定义引用了命名空间类CTest

我认为这是一个很小的代价,必须编写Test::FreeFunction

希望这可以帮助!

如果你没有限定FreeFunction定义,编译器肯定不知道你想要为先前的前向声明的Test :: FreeFunction或当前命名空间中的单独FreeFunction提供实现。

另一方面,只有一种方法可以解析名称CTest - 作为Test命名空间中的类定义。 因此,没有必要完全限定它。

但是,如果CTest名称解析是不明确的(比如当前命名空间中还有另一个CTest类),则必须完全限定方法声明。

在实现函数时,我发现打开命名空间通常是可取的。 记住你可以重新打开它们......

// in Test.cpp
namespace Test
{
   int FreeFunction()
   {
       return 0;
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM