[英]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.