2011-05-03 64 views
2

在.hpp中的匿名命名空間中定義函數簽名時,將該函數的實現放在.cpp中是否有效?當我這樣做時,我得到一個未定義的引用錯誤。實現在匿名命名空間中聲明的函數時未定義的引用鏈接器錯誤

例子:

//hpp 
#ifndef __BAR_HPP_ 
#define __BAR_HPP_ 
namespace foo 
{ 
    namespace 
    { 
     struct Bar 
     { 
      void func(); 
     }; 
    } 
} 
#endif 

//cpp 
using foo; 

void Bar::func() 
{ 
    //... 
} 
+2

爲什麼要使用這樣的匿名命名空間?像'__BAR_HPP_'這樣的名稱包含一個雙下劃線,或者以下劃線和大寫字母開頭的名字保留給C++實現。 – 2011-05-03 08:19:49

+0

我這樣使用它,因爲函數func()只與Bar類有關。 – Graeme 2011-05-03 08:20:31

+0

好吧,使它成爲酒吧的私人功能。或者將它放在Bar實現文件中的匿名名稱空間中。 – 2011-05-03 08:28:05

回答

5

這個想:

namespace foo 
{ 
    struct Bar 
    { 
     void func(); 
    }; 
} 
void Bar::func() { /*impl...*/ } 

您的代碼不會對這個代碼不相同工作的原因所在 - 正在錯誤的範圍內提供的定義。我們需要的是:

void foo::Bar::func() { /*impl...*/ } 

但你放什麼代替foo::指一個匿名命名空間的名稱?它沒有一個。

底線:無法在匿名命名空間內聲明某些內容,然後在其他地方定義它,因爲不存在指定適當範圍的機制。

相關問題