2010-03-29 18 views
0

Я пытаюсь выполнить пример, приведенный для реализации XML-библиотеки C++ Xerces. Я скопировал код точно, но у меня возникли проблемы с его компиляцией.Xerces C++ SAX Parsing Проблема: ожидаемое имя класса перед '{' token

error: expected class-name before '{' token 

Я огляделся в поисках решения, и я знаю, что эта ошибка может быть вызвана круговым включает или не определение класса, прежде чем он используется, но, как вы можете видеть из кода, я только 2 файла: MySAXHandler.hpp и MySAXHandler.cpp. Тем не менее, класс MySAXHandler получен из HandlerBase, который включен.

MyHandler.hpp

#include <xercesc/sax/HandlerBase.hpp> 

class MySAXHandler : public HandlerBase { 
public: 
    void startElement(const XMLCh* const, AttributeList&); 
    void fatalError(const SAXParseException&); 
}; 

MySAXHandler.cpp

#include "MySAXHandler.hpp" 
#include <iostream> 

using namespace std; 

MySAXHandler::MySAXHandler() 
{ 
} 

void MySAXHandler::startElement(const XMLCh* const name, 
         AttributeList& attributes) 
{ 
    char* message = XMLString::transcode(name); 
    cout << "I saw element: "<< message << endl; 
    XMLString::release(&message); 
} 

void MySAXHandler::fatalError(const SAXParseException& exception) 
{ 
    char* message = XMLString::transcode(exception.getMessage()); 
    cout << "Fatal Error: " << message 
     << " at line: " << exception.getLineNumber() 
     << endl; 
    XMLString::release(&message); 
} 

Я компиляции так:

g++ -L/usr/local/lib -lxerces-c -I/usr/local/include -c MySAXHandler.cpp 

Я посмотрел через HandlerBase и определяется, поэтому я не знаю, почему я не могу извлечь из него класс? Нужно ли переопределять все виртуальные функции в HandlerBase? Я новичок в C++.

Заранее спасибо.

ответ

2

Попробуйте добавить using namespace xercesc; или явно укажите пространство имен для классов Xerces (например, xercesc::HandlerBase).

Редактировать: Существует также макрос XERCES_CPP_NAMESPACE_USE, который должен быть эквивалентен оператору using.

+0

«Использование пространства имен xercesc;» не повлияло, но «xercesc :: HandlerBase» избавился от ошибки в имени класса. Благодаря! – aduric

+0

Добро пожаловать. Если это сработало, директива по использованию также должна работать, при условии, что она размещена правильно (это будет после оператора '#include ' в вашем случае). Однако альтернативное решение лучше в любом случае, потому что использование директив в заголовках опасно. (Http://mariusbancila.ro/blog/2009/04/14/avoid-using-directives-in-header-files/) – kloffy

Смежные вопросы