使用CodeSynthesis XSD树映射的C ++类型

时间:2008-10-02 20:05:25

标签: c++ xsd templates types codesynthesis

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

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

我从名为ABSTRACTNETWORKMODEL的类开始,类versno_typefromtime_type 在里面输入typedef。这是我尝试使用的构造函数以及typedef

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_;

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

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 ++。

2 个答案:

答案 0 :(得分:3)

我之前一直被这个咬过。如果行:

::xml_schema::time t();

与你的代码中出现的完全相同(即,使用parens)然后问题是你实际上没有像你想象的那样实例化对象。

要实例化您将使用的对象

::xml_schema::time t;

第一行是声明一个不带参数的函数t(),并返回一个::xml_schema::time类型的对象。由于没有正文,编译器会认为您稍后会定义该函数。它是完全合法的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

因此“实例化时间不会导致错误”的原因是时间对象从未实例化过。时间类也没有默认构造函数,并且尝试使用正确的语法实例化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 ++,但语法很难保持一段时间。

答案 1 :(得分:0)

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

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