簡體   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