1

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

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

我从一个名为 ABSTRACTNETWORKMODEL 的类开始,其中包含类型versno_typefromtime_type typedef'd。这是我尝试使用的构造函数以及 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++。

4

2 回答 2

3

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

::xml_schema::time t();

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

要实例化您将使用的对象

::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

所以“时间的实例化没有导致错误”的原因是时间对象从未被实例化。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++,但语法有时会变得很难保持直截了当。

于 2008-10-03T18:13:44.703 回答
0

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

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

于 2008-10-02T21:24:33.773 回答