首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CodeSynthesis XSD树映射的C++类型

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

Stack Overflow用户
提问于 2008-10-02 20:05:25
回答 2查看 1.4K关注 0票数 1

我正在使用CodeSynthesis XSD C++/Tree Mapping实用程序将现有的xsd转换成可以填充值的c++代码。这就是我们总是要确保遵循模式。

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

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

代码语言:javascript
复制
ABSTRACTNETWORKMODEL(const versno_type&, const fromtime_type&);
typedef ::xml_schema::double_ versno_type;
typedef ::xml_schema::time fromtime_type;

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

代码语言:javascript
复制
typedef ::xsd::cxx::tree::time<char, simple_type> time;
typedef double double_;

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

代码语言:javascript
复制
template<typename C, typename B>
class time: public B, public time_zone
{
  public:
  time(unsigned short hours, unsigned short minutes, double seconds);
  ...
}

我知道我没有正确地创建一个新的ABSTRACTNETWORKMODEL,但是我不知道我需要做什么。在这一点上,我想做的就是:

代码语言:javascript
复制
  ::xml_schema::time t();
  ABSTRACTNETWORKMODEL anm(1234, t);

当然,这会抛出一个关于转换第二个参数的错误,但是有人能告诉我是什么不正确吗?或者至少给我指出一条正确的道路,因为我现在正在尝试做的一件事是学习更多的c++。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2008-10-03 18:13:45

我以前也被这玩意儿咬过。如果行:

代码语言:javascript
复制
::xml_schema::time t();

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

要实例化一个对象,您可以使用

代码语言:javascript
复制
::xml_schema::time t;

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

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

代码语言:javascript
复制
::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对象从未被实例化。time类也没有默认的构造函数,尝试用正确的语法实例化t会抛出预期的错误。

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

代码语言:javascript
复制
int hours = time().get_hours(); // assuming that there is now a default constructor

因为删除第一组括号将导致错误:

代码语言:javascript
复制
int hours = time.set_time("12:00:00am"); // error: there is a time class, but no object named "time"

相信我,我真的很喜欢C++,但是有时候语法真的很难保持整洁。

票数 3
EN

Stack Overflow用户

发布于 2008-10-02 21:24:34

在办公室里被问到,我的问题似乎不是创建ABSTRACTNETWORKMODEL,而是::xml_schema::time。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/164305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档