【问题标题】:C++ types using CodeSynthesis XSD Tree Mapping使用 CodeSynthesis XSD 树映射的 C++ 类型
【发布时间】:2010-09-14 22:12:43
【问题描述】:

我正在使用 CodeSynthesis XSD C++/Tree Mapping 实用程序将现有 xsd 转换为 c++ 代码,我们可以在其中填充值。这是我们始终确保遵循架构的原因。

完成转换后,我正在尝试让它工作,以便进行测试。问题是,我不习惯在 c++ 中这样做,这是我第一次使用这个工具。

我从一个名为 ABSTRACTNETWORKMODEL 的类开始,其类型为 versno_typefromtime_type typedef'd 里面。这是我尝试使用的构造函数以及 typedefs

ABSTRACTNETWORKMODEL(const versno_type&, const fromtime_type&);
typedef ::xml_schema::double_ versno_type;
typedef ::xml_schema::time fromtime_type;

所有这些都在 ABSTRACTNETWORKMODEL 类中,double_ 和 time 的定义是:

typedef ::xsd::cxx::tree::time<char, simple_type> time;
typedef double double_;

其中时间的定义是一个具有多个构造函数的类:

template<typename C, typename B>
class time: public B, public time_zone
{
  public:
  time(unsigned short hours, unsigned short minutes, double seconds);
  ...
}

我知道我没有正确创建一个新的 ABSTRACTNETWORKMODEL,但我不知道我需要做什么。这是我目前要做的所有事情:

  ::xml_schema::time t();
  ABSTRACTNETWORKMODEL anm(1234, t);

当然,这会引发关于转换第二个参数的错误,但是有人可以告诉我这是不正确的吗?或者至少为我指明正确的道路,因为我现在想做的一件事就是学习更多的 c++。

【问题讨论】:

    标签: c++ xsd templates types codesynthesis


    【解决方案1】:

    我以前被这个咬过。如果行:

    ::xml_schema::time t();
    

    与您的代码中出现的完全一样(即带有括号),那么问题是您实际上并没有像您想的那样实例化一个对象。

    要实例化您将使用的对象

    ::xml_schema::time t;
    

    相反,第一行声明了一个不带参数并返回::xml_schema::time 类型的对象的函数t()。由于没有主体,编译器认为您稍后会定义该函数。它是完全合法的 C++,它是人们经常做的事情(例如,在头文件中),因此编译器接受它,不会发出警告,因为它无法知道这不是你的意思,并且会做一些你没有做的事情没想到。

    当你将该函数传递给ABSTRACTNETWORKMODEL 构造函数时,你会得到一个错误,因为你不能将函数作为参数传递(你可以传递一个指向函数的指针,你可以调用函数,传递结果临时):

    ::xml_schema::time t();
    ABSTRACTNETWORKMODEL anm(1234, t()); // calls t(), gets a temporary of type ::xml_schema::time, and passes the temporary to the constructor
    

    所以“时间的实例化没有导致错误”的原因是时间对象从未被实例化。 time 类也没有默认构造函数,尝试使用正确的语法实例化 t 会抛出您所期望的错误。

    为了记录,在某些情况下需要括号。例如,当实例化一个临时对象并在同一行中操作该临时对象时:

    int hours = time().get_hours(); // assuming that there is now a default constructor
    

    因为去掉第一组括号会报错:

    int hours = time.set_time("12:00:00am"); // error: there is a time class, but no object named "time"
    

    相信我,我真的很喜欢 C++,但语法有时很难保持直截了当。

    【讨论】:

      【解决方案2】:

      在办公室里询问,看来我的问题不是创建 ABSTRACTNETWORKMODEL,而是实际上是 ::xml_schema::time。

      我觉得奇怪的是时间的实例化没有导致错误,因为它没有任何默认构造函数,或者即使模板和类型正确,它也没有被接受。

      【讨论】:

        猜你喜欢
        • 2015-02-21
        • 2019-11-28
        • 1970-01-01
        • 1970-01-01
        • 2020-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-30
        相关资源
        最近更新 更多