C++ 错误:字段‘;m#ssmmap&x2019;具有不完整的类型C++;
我有下面的头文件C++ 错误:字段‘;m#ssmmap&x2019;具有不完整的类型C++;,c++,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;
#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
的定义,这可能已经在头文件中完成了
#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__ */
对于外部类VRF,不存在相同的问题
这不是同一个问题,因为VRF
不是由值使用的,而是作为指针使用的。(即使使用VRF
对象作为参数的值,也不一样,因为该函数的签名可以使用该信息创建:只有在调用该函数时,类型必须完整。)您只声明了SSMMap
(更具体地说:forward declared):
编译器需要SSMMap
的定义,但它找不到该定义,因此它会抱怨
您需要
#包括SSMMap
定义所在的标题。您可以通过两种方式解决此问题:
将其更改为指针,这样它就不需要类的规范:SSMMap*m_SSMMap代码>
包括SSMMap头文件,而不是行:class SSMMap
您只向前声明了SSMMap
。要分解SSMMap m_SSMMap
编译器需要知道要分配多少空间。要做到这一点,需要查看它的完整定义。这里有兴趣指出SSMMap
和VRF
之间的区别。非常感谢。这澄清了问题。