2014-11-04 43 views
0

我有一个XSD架构利用substitutionGroups(多态类型)。该模式用于Java和C++,Java和JAXB很容易,我在那里没有任何问题。我使用Code Synthesis为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 

基类型是所谓的 '消息类型' 和有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 
    } 

所以理论上我应该可以做这样的事情在我的同班同学检查正在处理的消息的类型。

在我的测试类,我试图打印出的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; 
    } 

但是,当我试图编译我的测试类,我得到的消息“未定义的引用“所属类别为csspap_xsd :: SuccessResponseType'”。

我已经阅读了几次xsdcxx的参数......并且不知道我可能会丢失什么以及为什么我无法获取模式类的typeinfo。

任何帮助将不胜感激!

-Ace

+0

翻翻我的过去的帖子,发现这一点。解决方案只是说SuccessResponse.exists()。 – AceFunk 2017-12-05 18:59:42

回答

0

你做的很基本的错误,你不能没有初始化的声明引用:

const ::csspap_xsd::SuccessResponseType& s;