gpt4 book ai didi

c++ - 错误 : field ‘m_ssmmap’ has incomplete type C++

转载 作者:行者123 更新时间:2023-11-30 05:24:22 30 4
gpt4 key购买 nike

我有以下头文件。

#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 的定义,这可能已经在头文件中完成。

the same problem is not seen for external class VRF

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

关于c++ - 错误 : field ‘m_ssmmap’ has incomplete type C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38688295/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com