代码合成生成的类对typeinfo的未定义引用

Undefined reference to typeinfo for Code Synthesis generated Class

本文关键字:typeinfo 未定义 引用 代码      更新时间:2023-10-16

我有一个使用substitutionGroups(多态类型)的XSD架构。模式在Java和C++中使用,Java和JAXB很简单,我在那里没有任何问题。我正在使用代码合成为Schema生成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和UnpolicydMessageType)扩展了基类型。一些消息扩展了这些类型。我正在玩的是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
   }

所以理论上,我应该能够在课堂上做这样的事情来检查正在处理的消息的类型。

在我的测试课上,我试图打印出SuccessResponseType:的typeinfo.name

   #include <typeinfo>
   #include <iostream>
   #include "Schema.hpp"
   int main() {
      std::cout << "Schema SuccessResponseType name: " << typeid(csspap_xsd::SuccessResponseType).name << std::endl;
   return 0;
   }

但是,当我试图编译我的测试类时,我会得到消息"未定义对'typeinfo for csspap_xsd::SuccessResponseType'的引用"。

我已经把xsdcxx的论点读了好几遍了。。。不知道我可能缺少什么,也不知道为什么我不能获得模式类的typeinfo。

如有任何帮助,我们将不胜感激!

-Ace

您正在做一个非常基本的错误,您不能在没有初始化的情况下声明引用:

const ::csspap_xsd::SuccessResponseType& s;