前向声明问题
自己简单封装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));
我在实现文件中已经载入了xerces的头文件,为什么DOMElement还是不完整类型呢?
[解决办法]
把前向声明放外面。
[解决办法]
错误原因:XMLCommon::DOMElement.
所以,是编译器把DOMElement当做XMLCommon的嵌套的类了.
所以,你需要在XMLCommon外声明DOMElement.
又因为 DOMElement是在某个名字空间中的,因为没用过这个库,所以我假设他的名字是abc.
那么像下面这样前向声明
namespace abc
{
class DOMElement;
}
using abc::DOMElement;