[odb-users] Loading of lazy ptr within odb object class
Lisa Fiedler
lfiedler at informatik.uni-leipzig.de
Sat Feb 23 04:14:47 EST 2019
Hello,
I am having trouble to execute the load operation on
odb::lazy_shared_ptr within the odb class.
To identify the reasons I set up the following program:
Two odb classes: employee and employer (and some other classes but this
is not really relevant).
Basically it looks like this:
#pragma db object pointer(std::shared_ptr) session table("schema1.employer")
class employer
{
public:
employer (const std::string& name);
const std::string&
name () const;
// Employees of this employer.
//
typedef std::vector<odb::lazy_weak_ptr<employee>> employees_type;
const employees_type&
employees () const;
employees_type&
employees ();
private:
friend class odb::access;
employer () {}
#pragma db id type("VARCHAR (255)") column("name")
std::string name_;
#pragma db unordered table("schema1.employer_employees")
id_column("name") value_column("id")
employees_type employees_;
};
#pragma db object pointer(std::shared_ptr) session table("schema1.employee")
class employee
{
public:
typedef odb::lazy_shared_ptr<employer> employer_type;
employee (const std::string& first,
const std::string& last,
std::shared_ptr<employer> employer)
: first_ (first), last_ (last), emPloyer_ (employer)
{
}
// Name.
//
const std::string&
first () const
{
return first_;
}
const std::string&
last () const
{
return last_;
}
unsigned long& id(){
return id_;
}
// Employer.
//
employer_type
emPloyer () const
{
return emPloyer_;
}
void
emPloyer (employer_type employer)
{
emPloyer_ = employer;
}
// having issues here!!!
* void printEmployer(){**
** cout << emPloyer_.load()->name() << endl;**
** }*
private:
friend class odb::access;
employee () {}
#pragma db id type("INTEGER") column("id")
unsigned long id_;
#pragma db type("VARCHAR (255)") column("first")
std::string first_;
#pragma db type("VARCHAR (255)") column("last")
std::string last_;
#pragma db not_null column("employer")
employer_type emPloyer_;
};
Now what does not work out is the printEmployer method in the employee
class (bold type setting). Error message:
"error: no match for ‘operator=’ (operand types are
‘std::shared_ptr<employer>’ and
‘odb::object_traits<employer>::pointer_type {aka employer*}’)
p_ = i_.template load<T> (true); // Reset id"
If I execute this operation, i.e. emPloyer.load()->name(), for instance
in the main method it executes just fine. I suspected the reason is,
that in main.cpp I included employee-odb.hxx, which I did not do in
employee.hxx where the above mentioned classes are defined. I therefore
tried to include it there, but this apparently leads to some cyclic
inclusions.
Thanks a lot for any suggestions to what I can do, to enable lazy ptr
loading wihtin odb classes.
More information about the odb-users
mailing list