我有以下头文件。

#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类完全相同的方式。

最佳答案

编译器要自动实例化SSMMap类的对象,因为您是按值嵌入它的。但是它找不到它的构造函数。像这样的前向声明

class SSMMap;

仅允许声明该类型的指针(或引用)。在您的情况下,您必须使用
SSMMap* m_ssmmap;

或者
SSMMap& m_ssmmap;

但是,然后您必须注意相应cpp文件中的构造和破坏。这种技术通常称为PIMPL习惯用语(表示实现的指针)。

您拥有的另一个选项是包括SSMMap的定义,它可能已经在头文件中完成了。



这是不一样的问题,因为VRF不是值使用的,而是用作指针的。 (即使您使用VRF对象作为参数的值,也不相同,因为可以使用该信息创建该函数的签名:仅在调用该函数时,该类型必须完整。)

09-06 17:45