Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 错误:字段‘;m#ssmmap&x2019;具有不完整的类型C++;_C++ - Fatal编程技术网

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
    之间的区别。非常感谢。这澄清了问题。