[odb-users] Self persisting objects?
Oded Arbel
oded at geek.co.il
Wed Aug 29 14:13:57 EDT 2012
Hi guys.
I'm trying to write a model class that is self contained - i.e. it
includes all business logic to manipulate the ODB API and does not
require the application to know ODB to operate it.
As part of that, I thought it will be cool (and OOish) to be able to
create and persist objects using a simple API like this:
Employee *e = new Employee("John","Doe");
e->persist();
The implementation of Employee::persist() could be pretty trivial
(assuming someone knows how to initialize a database connection. I'm
going to leave that as an exercise to the user and assume an already
inited static field):
void Employee::persist() {
odb::transaction t(s_db->begin());
s_db->persist(this);
t.commit();
}
Unfortunately Visual Studio 10 doesn't like me much and breaks when
trying to compile.
I've seen database.hxx has a definition for persist(T* o), but the
"this" pointer is "const Class*" which won't fit.
This is what the compiler has to say (actual class names have been
modified to protect the cryptic):
---8<---
1>------ Build started: Project: data-model, Configuration: Debug Win32 ------
1> employee.cpp
1>c:\XXX\libodb-2.0.1\odb\traits.hxx(103): error C2504:
'odb::access::object_traits<T>' : base class undefined
1> with
1> [
1> T=model::Employee
1> ]
1> c:\XXX\data-model\src\employee.cpp(17) : see reference to
class template instantiation 'odb::object_traits<T>' being compiled
1> with
1> [
1> T=model::Employee
1> ]
1>c:\XXX\libodb-2.0.1\odb\traits.hxx(104): error C2146: syntax error :
missing ',' before identifier 'pointer_type'
1>c:\XXX\libodb-2.0.1\odb\traits.hxx(104): error C2065: 'pointer_type'
: undeclared identifier
1>c:\XXX\libodb-2.0.1\odb\traits.hxx(105): error C2955:
'odb::access::object_factory' : use of class template requires
template argument list
1> c:\XXX\libodb-2.0.1\odb\traits.hxx(17) : see declaration
of 'odb::access::object_factory'
1>c:\XXX\libodb-2.0.1\odb\traits.hxx(119): error C2146: syntax error :
missing ';' before identifier 'const_pointer_type'
1>c:\XXX\libodb-2.0.1\odb\traits.hxx(119): error C3254:
'odb::object_traits<T>' : class contains explicit override
'const_pointer_type' but does not derive from an interface that
contains the function declaration
1> with
1> [
1> T=model::Employee
1> ]
1>c:\XXX\libodb-2.0.1\odb\traits.hxx(119): error C2838:
'const_pointer_type' : illegal qualified name in member declaration
1>c:\XXX\libodb-2.0.1\odb\traits.hxx(119): error C4430: missing type
specifier - int assumed. Note: C++ does not support default-int
1>c:\XXX\libodb-2.0.1\odb\traits.hxx(119): error C2602:
'odb::object_traits<T>::const_pointer_type' is not a member of a base
class of 'odb::object_traits<T>'
1> with
1> [
1> T=model::Employee
1> ]
1> c:\XXX\libodb-2.0.1\odb\traits.hxx(119) : see declaration
of 'odb::object_traits<T>::const_pointer_type'
1> with
1> [
1> T=model::Employee
1> ]
1>c:\XXX\libodb-2.0.1\odb\traits.hxx(119): error C2868:
'odb::object_traits<T>::const_pointer_type' : illegal syntax for
using-declaration; expected qualified-name
1> with
1> [
1> T=model::Employee
1> ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
---8<---
Any idea what I'm doing wrong here?
--
Oded
More information about the odb-users
mailing list