我有以下头文件。
#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
对象作为参数的值,也不相同,因为可以使用该信息创建该函数的签名:仅在调用该函数时,该类型必须完整。)