Я был укушен этим раньше. Если строка:
::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 ++, но синтаксис может иногда становиться действительно сложным.