Неопределенная ссылка на typeinfo для сгенерированного Code Class

У меня есть XSD-схема, которая использует замещающие группы (полиморфные типы). Схема используется в Java и C ++, Java и JAXB просты, и у меня нет проблем там. Я использую Code Synthesis для генерации классов C ++ для Schema, и именно здесь у меня возникают проблемы.

Аргументы командной строки:

   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.

Суть в том, чтобы иметь возможность передавать сообщение как тип сообщения. Я пытаюсь определить, какой тип сообщения обрабатывается.

Фрагмент схемы:

    <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 несколько раз … и понятия не имею, чего мне не хватает и почему я не могу получить typeinfo для своих классов схемы.

Любая помощь будет принята с благодарностью!

-туз

0

Решение

Вы делаете очень простую ошибку, вы не можете объявить ссылку без инициализации в:

const ::csspap_xsd::SuccessResponseType& s;
0

Другие решения


По вопросам рекламы [email protected]