我正在使用CodeSynthesis XSD C++/Tree Mapping实用程序将现有的xsd转换成可以填充值的c++代码。这就是我们总是要确保遵循模式。
完成转换后,我正在尝试让它工作,这样我就可以测试它了。问题是,我不习惯在c++中这样做,而且这是我第一次使用这个工具。
我从一个名为ABSTRACTNETWORKMODEL的类开始,里面有versno_type和fromtime_type类型。下面是我尝试使用的构造函数以及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++。
发布于 2008-10-03 18:13:45
我以前也被这玩意儿咬过。如果行:
::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对象从未被实例化。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-02 21:24:34
在办公室里被问到,我的问题似乎不是创建ABSTRACTNETWORKMODEL,而是::xml_schema::time。
我觉得奇怪的是,time的实例化没有导致错误,因为它没有任何默认构造函数,或者为什么即使模板和类型是正确的,它也不被接受。
https://stackoverflow.com/questions/164305
复制相似问题