Типы C ++ с использованием CodeSynthesis XSD Tree Mapping - PullRequest
1 голос
/ 03 октября 2008

Я использую CodeSynthesis XSD C ++ / Tree Mapping для преобразования существующего xsd в код c ++, в который мы можем заполнить значения. Это было то, что мы всегда следили за схемой.

После выполнения преобразования я пытаюсь заставить его работать, чтобы я мог проверить его. Проблема в том, что я не привык делать это в C ++, и я впервые использую этот инструмент.

Я начинаю с класса ABSTRACTNETWORKMODEL с типами versno_type и fromtime_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 ++.

Ответы [ 2 ]

3 голосов
/ 03 октября 2008

Я был укушен этим раньше. Если строка:

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

Таким образом, причина того, что «создание времени не привело к ошибке», заключается в том, что объект времени никогда не создавался. У временного класса также нет конструктора по умолчанию, и попытка создать экземпляр 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 ++, но синтаксис может иногда становиться действительно сложным.

0 голосов
/ 03 октября 2008

Обсудили в офисе, и, похоже, моя проблема не в том, чтобы создать ABSTRACTNETWORKMODEL, но на самом деле это был :: xml_schema :: time.

Мне показалось странным, что создание экземпляра времени не вызвало ошибку, учитывая, что у него нет конструкторов по умолчанию или почему оно не было принято, даже если шаблон и типы были правильными.

...