У меня есть схема XSD, которая использует подстановочные группы (полиморфные типы). Схема используется в Java и C++, Java и JAXB проста, и у меня там никаких проблем нет. Я использую Code Synthesis для генерации классов C++ для схемы, и именно там у меня возникают проблемы.
Аргументы командной строки:
xsdcxx cxx-tree \
--namespace-map "http://"..."="csspap_xsd" \
--hxx-suffix .hpp \
--cxx-suffix .cpp \
--generate-polymorphic \
--polymorphic-type-all \
--generate-serialization \
--root-element-all \
Schema.xsd
Базовый тип называется "MessageType", и существует 3 абстрактных типа (RequestMessageType, ResponseMessageType и UnsolicitedMessageType), которые расширяют базовый тип. Несколько сообщений расширяют эти типы. Тот, с которым я играю, это SuccessResponeType, который расширяет ResponseMessageType.
Дело в том, чтобы иметь возможность передавать сообщение в виде MessageType. Я пытаюсь определить, какой тип сообщения обрабатывается.
Фрагмент схемы:
<xs:element name="Message" type="MessageType">
<xs:annotation>
<xs:documentation>Root Level Message</xs:documentation>
</xs:annotation>
</xs:element>
<xs:complexType name="MessageType" abstract="true">
<xs:annotation>
<xs:documentation>Represents a Request, Response, or Unsolicited Response Message</xs:documentation>
</xs:annotation>
</xs:complexType>
<xs:complexType name="ResponseMessageType" abstract="true">
<xs:annotation>
<xs:documentation>All Response Message Types</xs:documentation>
</xs:annotation>
<xs:complexContent>
<xs:extension base="MessageType"/>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="SuccessResponseType">
<xs:complexContent>
<xs:extension base="ResponseMessageType">
<xs:sequence>
<xs:element name="Comment" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="SuccessResponse" type="SuccessResponseType" substitutionGroup="Message"/>
Внутри файла Schema.cpp есть код, который сравнивает классы:
const ::csspap_xsd::SuccessResponseType& s;
if (typeid(::csspap_xsd::SuccessResponseType) == (typeid(s)) {
// this is a SuccessResponseType
}
Поэтому в теории я должен был бы сделать что-то вроде этого в своем классе, чтобы проверить тип обрабатываемого сообщения.
В моем тестовом классе я пытаюсь распечатать typeinfo.name для параметра SuccessResponseType:
#include <typeinfo>
#include <iostream>
#include "Schema.hpp"
int main() {
std::cout << "Schema SuccessResponseType name: " << typeid(csspap_xsd::SuccessResponseType).name << std::endl;
return 0;
}
Но когда я пытаюсь скомпилировать свой тестовый класс, я получаю сообщение "неопределенная ссылка на" typeinfo для csspap_xsd :: SuccessResponseType ".
Я несколько раз читал аргументы для xsdcxx... и понятия не имею, чего я могу потерять, и почему я не могу получить типinfo для моих классов схемы.
Любая помощь будет принята с благодарностью!
-Ace
Вы делаете очень основную ошибку, вы не можете объявить ссылку без инициализации в:
const ::csspap_xsd::SuccessResponseType& s;