首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

前向声明有关问题

2012-04-21 
前向声明问题自己简单封装xml解析库xerces头文件(xml.h)如下:C/C++ code#include stringclass XMLCommon

前向声明问题
自己简单封装xml解析库xerces
头文件(xml.h)如下:

C/C++ code
#include <string>class XMLCommon{    class DOMElement;    class XercesElement    {    public:        XercesElement(DOMElement *el);        ~XercesElement();        operator DOMElement *();        DOMElement *value();    private:        DOMElement *elem;    };    class XercesElementList    {        class ElementList        {        public:            typedef struct _node            {                _node():next(NULL),pre(NULL){}                DOMElement *obj;                _node * next;                _node * pre;            }NODE,*PNODE;        public:            ElementList();            ~ElementList();        public:            void put(XercesElement *el);            XercesElement *get();            void clear();        private:            PNODE head;            PNODE tail;            PNODE current;            int length;        };    public:        XercesElementList();        ~XercesElementList();        void push(DOMElement*);        XercesElement *fetch();        int length();        bool empty();    private:        ElementList *ellist;    };public:    static std::string GetAttributeByName(XercesElement,const char*);    static XercesElement GetFirstChildElement(XercesElement);    static XercesElement GetFirstSibiling(XercesElement);        static std::string GetElementContent(XercesElement);    static XercesElementList GetNodesByTagName(XercesElement,const char*);    static XercesElement GetElementByTagName(XercesElement,const char*);    static std::string GetElementTagName(XercesElement);    //static std::string toString(const XMLCh *) ;        };

实现文件如下
C/C++ code
#include "parser.h"#include <xercesc/util/PlatformUtils.hpp> #include <xercesc/dom/DOM.hpp> #include <xercesc/dom/DOMElement.hpp>#include <xercesc/parsers/XercesDOMParser.hpp> #include <xercesc/util/XMLString.hpp>#pragma comment(lib, "xerces-c_3.lib") using namespace std;XERCES_CPP_NAMESPACE_USEstring XMLCommon::GetAttributeByName(XercesElement elem,const char* name){    DOMElement *le = elem.value();    if(!(elem && name))        throw ArguEx();    const XMLCh *xmlCh = le->getAttribute(toLocal(name));      return toString(xmlCh);}......................................


为了在头文件中使用DOMElement所以做了前向声明,而在实现文件中include xerces的头文件
问题也出来了,
C/C++ code
const XMLCh *xmlCh = le->getAttribute(toLocal(name));
这一行,说le是不完整类型,使用了未定义类型“XMLCommon::DOMElement”。
我在实现文件中已经载入了xerces的头文件,为什么DOMElement还是不完整类型呢?

[解决办法]
把前向声明放外面。
[解决办法]
错误原因:XMLCommon::DOMElement.
所以,是编译器把DOMElement当做XMLCommon的嵌套的类了.
所以,你需要在XMLCommon外声明DOMElement.
又因为 DOMElement是在某个名字空间中的,因为没用过这个库,所以我假设他的名字是abc.
那么像下面这样前向声明
namespace abc
{
class DOMElement;

}
using abc::DOMElement;

热点排行