Я использую утилиту 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);
Это, конечно, вызывает ошибку при преобразовании второго параметра, но может ли кто-нибудь сказать мне, что это неверно? Или, по крайней мере, указать мне правильный путь, поскольку одна из вещей, которые я пытаюсь сделать прямо сейчас, - это изучить С ++.





Когда меня спросили в офисе, выяснилось, что моя проблема заключалась не в создании ABSTRACTNETWORKMODEL, а на самом деле :: xml_schema :: time.
Мне кажется странным, что создание экземпляра времени не вызвало ошибки, учитывая, что у него нет конструкторов по умолчанию или почему оно не было принято, даже если шаблон и типы были правильными.
Меня это уже кусало. Если строка:
::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++, но иногда бывает очень сложно сохранить четкость синтаксиса.