Я пробую ODB ORM, и мне нужно придерживаться интерфейса, поэтому мне нужно взять объект const и сохранить его. Я не уверен, позволяет ли ODB API сохранять объект const, потому что какая-то часть кажется подготовленной к этому, но это не работает.
Я получаю эту ошибку от gcc здесь:
void OdbReportRW::write_object(const MyObject &my_object)
{
odb::core::transaction t{db->begin()};
db->persist(my_object);
t.commit();
}
это ошибка, которая, я думаю, говорит о том, что my_object не должен быть const:
In file included from /usr/local/include/odb/database.hxx:632:0,
from odb_report.hpp:21,
from src/vcf/odb_report.cpp:18:
/usr/local/include/odb/database.txx: In instantiation of ‘typename odb::object_traits<T>::id_type odb::database::persist_(T&) [with T = const MyObject; odb::database_id DB = (odb::database_id)5u; typename odb::object_traits<T>::id_type = long unsigned int]’:
/usr/local/include/odb/database.ixx:167:45: required from ‘typename odb::object_traits<T>::id_type odb::database::persist(const T&) [with T = MyObject; typename odb::object_traits<T>::id_type = long unsigned int]’
src/vcf/odb_report.cpp:134:26: required from here
/usr/local/include/odb/database.txx:38:39: error: no matching function for call to ‘odb::object_traits_impl<MyObject, (odb::database_id)5u>::persist(odb::database&, const MyObject&)’
object_traits::persist (*this, obj);
^
/usr/local/include/odb/database.txx:38:39: note: candidate is:
In file included from src/vcf/odb_report.cpp:27:0:
my-object-error-odb.hxx:247:5: note: static void odb::access::object_traits_impl<MyObject, (odb::database_id)1u>::persist(odb::database&, odb::access::object_traits<MyObject>::object_type&)
persist (database&, object_type&);
^
my-object-odb.hxx:247:5: note: no known conversion for argument 2 from ‘const MyObject’ to ‘odb::access::object_traits<MyObject>::object_type& {aka MyObject&}’
Та же ошибка с clang, немного более наглядная:
In file included from src/vcf/odb_report.cpp:18:
In file included from inc/vcf/odb_report.hpp:21:
In file included from /usr/local/include/odb/database.hxx:632:
/usr/local/include/odb/database.txx:38:36: error: binding of reference to type 'object_type' (aka 'MyObject') to a value of type 'const MyObject' drops qualifiers
object_traits::persist (*this, obj);
^~~
/usr/local/include/odb/database.ixx:167:12: note: in instantiation of function template specialization 'odb::database::persist_<const MyObject, 5>' requested here
return persist_<const T, id_common> (obj);
^
src/vcf/odb_report.cpp:134:13: note: in instantiation of function template specialization 'odb::database::persist<MyObject>' requested here
db->persist(my_object);
^
inc/vcf/error-odb.hxx:247:37: note: passing argument to parameter here
persist (database&, object_type&);
^
Тем не менее, я вижу в интерфейсе базы данных (из odb), что предусмотрены оба типа постоянства: ссылка и ссылка на констант (и другие с указателями):
// in odb/database.hxx
template <typename T>
typename object_traits<T>::id_type
persist (T& object);
template <typename T>
typename object_traits<T>::id_type
persist (const T& object);
Я видел, что аналогичная ошибка возникает (для find
не persist
) когда в классе нет конструктора по умолчанию для сохранения (MyObject здесь), но он есть, так что это не проблема. Я уже проверил, что конструктор по умолчанию генерирует только дополнительный метод find
в сгенерированном коде.
Сработало удаление спецификатора const в моем write_object
метод, но, как я уже сказал, я должен придерживаться интерфейса.
Любые идеи, чтобы сохранить постоянный объект?
прочитав внимательнее документацию я нашел это (http://www.codesynthesis.com/products/odb/doc/manual.xhtml#3.8):
Первая функция persist () ожидает постоянную ссылку на сохраняемый экземпляр. Вторая функция ожидает указатель на постоянный объект. Обе эти функции могут использоваться только для объектов с идентификаторами объектов, назначенными приложением (раздел 14.4.2, «auto»).
действительно, я использовал auto
спецификатор для идентификаторов, обрабатываемых базой данных:
// class MyObject
#pragma db id auto
unsigned long id_;
Так что кажется, что я не могу использовать одновременно auto id и const reference.
Других решений пока нет …