2012-09-25 3 views
2

내 문제는 Xerces 및 Windows 모두 'DOMDocument' 개체가 있습니다. Xerces와 내가 읽은 모든 것에 대해 here, herehere은 네임 스페이스를 정의하거나 DOMDocument을 정의하지 말 것을 제안했습니다. C++ " 'DOMDocument': redefinition"오류 Xercesc 함께

#undef DOMDocument 
#include <xerces/Stuff> 

Void foo(XERCES_CPP_NAMESPACE::DOMDocument* pDocument); 

또는

은 내가 제정신 경로를 이동 그냥 네임 스페이스를 적용하고 싶었지만 작동하지 않는 것. 문제를 해킹하는 것처럼 느껴지는 #undef을 사용하는 것은 정말로 주저합니다.

윈도우 파일 msxml.h은 재정의에 대해 불평하는 파일입니다.

로드 된 순서와 관련이 있습니까? XMLClass.h는 Xerces에 헤더를 포함 어디서,

#include <stdio.h> 
#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <vector> 
#include <list> 
#include <map> 
#include <ctime> 
#include "XMLClass.h" 

을 이런 식으로 뭔가가있다. 오류가 Microsoft 헤더에 나타나기 때문에 문제를 일으키는 원인을 알기가 정말 어렵습니다.

전체 프로젝트에서 'DOMDocument'을 검색했습니다. 'DOMDocument'XERCES_CPP_NAMESPACE의 네임 스페이스를 사용합니다.

: 나는 Xerces를 3.1 VS 2010

아이디어를 사용하고 있습니다?

업데이트 : 나는 Xerces를 헤더를 추가하고 난 여전히 오류가 발생하고있어 전에 #undef을 시도 . 그래서 저는 왜 두 가지 해결책이 모두 저에게 효과가 없는지에 관해서는 정말 망설이게되었습니다.

업데이트 2 : 는 또한 xercesc::DOMDocumentXERCES_CPP_NAMESPACE::DOMDocument에서 네임 스페이스를 변경하려고했지만이 도움이되지 않았습니다.

답변

4

헤더로드 순서 문제입니다. 내 경우 #include <Windows.h>에서

이 개 나는 것을 알고 있어요 도서관 어딘가에 자신의 코드 내부 msxml.h 포함이있다,

#include<Windows.h> 

#include<ole2.h> 

은의 다운 스트림 우연히 내 #include "XMLClass.h".xerces 네임 스페이스 염두이고 헤더가이 같은 반대 순서로 정의하는 경우 Microsoft가되지 않았기 때문에 그래서 솔루션은

#include<msxml.h>    //defines DOMDocument first  
//defines DOMDocument with a different namespace 
#include <xercesc/dom/DOMDocument.hpp> 

,이 같은 xerces 전에 msxml.h을 정의하는 것이었다

#include <xercesc/dom/DOMDocument.hpp> 
#include<msxml.h> 

코드를 컴파일해도 상관 없습니다. 컴파일러는 'DOMDocument'을 재정의하고 있다고 말하고 실제로 어떤 일이 일어나고 있는지 알려줍니다. 이것은 Microsoft가 msxml.h이라고 쓴 방식 때문입니다.

희망이 있으면 누구나이 문제에 부딪 힐 수 있습니다.

참고 : 정의 'DOMDocument를'개체 매개 변수를이 같은 형태를 돌려,

XERCES_CPP_NAMESPACE::DOMDocument xmlDoc; 

void setDoc(XERCES_CPP_NAMESPACE::DOMDocument xmlDoc); 

XERCES_CPP_NAMESPACE::DOMDocument getDoc(); 

을하거나 모호한 오류가 계속 나 때

네임 스페이스를 항상 포함해야한다 최악의 경우 런타임에 잘못된 데이터 형식으로 가정합니다.

2

또한 mshtml.h 파일과 xercesc에서 하나의 정의가 나오는 비슷한 문제에 직면했습니다. 이 내가 "DOMDocumentType" "예외 : DOMException" "DOMProcessingInstruction"

를 사용하여 한 세 가지 클래스가 있었다 순서를 변경 한 후에는 일

감사