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

0

У меня есть схема 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

  • 0
    Просматривал мои прошлые посты и нашел это. Решением было просто сказать SuccessResponse.exists ().
Теги:
polymorphism
substitution

1 ответ

0

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

const ::csspap_xsd::SuccessResponseType& s;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню