2016-07-31 117 views
1

我有以下頭文件。錯誤:字段'm_ssmmap'具有不完整類型C++

#ifndef __ROUTERPIM__ 
#define __ROUTERPIM__ 

#include "AbstractRouterVRF.h" 

class VRF; 
class SSMMap; 

class RouterPim: public AbstractRouterVRF{ 
    private: 
      string m_rp_address; 
      unsigned int m_hello_timer; 
      SSMMap m_ssmmap; //>> line of error 
    public: 
      RouterPim(); 
      RouterPim(VRF *vrf); 
      virtual ~RouterPim(); 
      void setrp_address(string rp_address); 
      void sethello_timer(unsigned int hello_timer); 
      string getrp_address(); 
      unsigned int gethello_timer(); 
      static RouterPim* instantiateRouterPim(VRF *vrf); 
      virtual string getclass_name(); 
      virtual void dump(); 
      virtual int validation(DCMENUMS *attr, void *new_value); 
      virtual int update(DCMENUMS *attr, void *value); 
      static string getAttributeStr(int attr); 
}; 

#endif /* __ROUTERPIM__ */ 

在編譯時,它是在13行

`RouterPim.h:13:10: error: field ‘m_ssmmap’ has incomplete type` 
`SSMMap m_ssmmap;` 
    ^

當我註釋掉線13條,它只是編譯好給下面的錯誤。任何人都可以指出我有什麼問題嗎?爲什麼在外部類VRF中看不到相同的問題,該問題的使用方式與SSMMap類完全相同。

+0

你只有轉發聲明'SSMMap'。爲了分配'SSMMap m_ssmmap',編譯器需要知道需要分配多少空間。要做到這一點需要看到它的完整定義。 –

+0

這裏有趣的是指出'SSMMap'和'VRF'之間的區別。 – Wolf

回答

1

編譯器希望自動實例化類SSMMap的對象,因爲您按值嵌入。但它找不到它的構造函數。像

class SSMMap; 

的前向聲明只允許聲明該類型的指針(或引用)。你的情況,你必須使用

SSMMap* m_ssmmap; 

或可替代

SSMMap& m_ssmmap; 

但你必須照顧建設和破壞在相應的CPP文件。這種技術通常稱爲PIMPL慣用語(意思是指向實現)。

您擁有的另一個選項是包含SSMMap的定義,該定義可能已在頭文件中完成。

the same problem is not seen for external class VRF

它是不一樣的問題,因爲VRF沒有使用的價值,但作爲一個指針來代替。 (即使你使用VRF對象作爲值的參數,它是不一樣的,因爲該函數的簽名可以用這些信息來創建:調用函數時,纔將類型必須是完整的)

+0

非常感謝。這澄清。 –

0

你只宣佈SSMMap(更具體:向前declarared):

class SSMMap; //Forward declaration 

編譯器需要定義SSMMap,它沒有找到,所以它COMP lains。

您需要#include其中SSMMap的定義所在的標頭。

0

您可以通過兩種方式解決這個問題:

  1. 將其更改爲指針,這樣就不需要類的規範:SSMMap *m_ssmmap;

  2. 包括SSMMap頭文件,而不是該行:class SSMMap;

相關問題