[odb-users] Is this possible?

Miguel Revilla Rodríguez yo at miguelrevilla.com
Wed Jun 27 10:10:45 EDT 2012


Now that looks fixed and odb compiler doesn't complain, but I'm
getting this on compiling the resulting code. I'm using G++ 4.7.1 with
c++11 BTW.

[  4%] Building CXX object CMakeFiles/yajpws.dir/odbClasses/node-odb.cpp.o
In file included from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.h:25:0,
                 from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:12:
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.h:105:13:
error: 'discriminator_type' in
'odb::access::object_traits<group>::root_traits {aka class
odb::access::object_traits<node>}' does not name a type
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.h:110:13:
error: 'id_type' in 'class odb::access::object_traits<node>' does not
name a type
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.h:111:13:
error: 'id_image_type' in 'class odb::access::object_traits<node>'
does not name a type
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.h:120:7:
error: 'image_type' in 'class odb::access::object_traits<node>' does
not name a type
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.h:240:12:
error: 'id_type' does not name a type
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.h:254:25:
error: 'id_image_type' has not been declared
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.h:263:11:
error: 'id_image_type' has not been declared
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.h:263:33:
error: 'id_type' does not name a type
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.h:263:40:
error: ISO C++ forbids declaration of 'parameter' with no type
[-fpermissive]
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.h:272:37:
error: incomplete type 'odb::access::object_traits<group>::root_traits
{aka odb::access::object_traits<node>}' used in nested name specifier
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.h:272:37:
error: incomplete type 'odb::access::object_traits<group>::root_traits
{aka odb::access::object_traits<node>}' used in nested name specifier
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.h:272:62:
error: template argument 1 is invalid
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.h:316:28:
error: 'id_type' does not name a type
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.h:316:35:
error: ISO C++ forbids declaration of 'parameter' with no type
[-fpermissive]
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.h:319:28:
error: 'id_type' does not name a type
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.h:319:35:
error: ISO C++ forbids declaration of 'parameter' with no type
[-fpermissive]
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.h:328:29:
error: 'id_type' does not name a type
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.h:328:36:
error: ISO C++ forbids declaration of 'parameter' with no type
[-fpermissive]
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.h:355:36:
error: 'id_type' does not name a type
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.h:355:43:
error: ISO C++ forbids declaration of 'parameter' with no type
[-fpermissive]
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.h: In
instantiation of 'struct odb::query_columns<group,
odb::access::object_traits<group> >':
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.h:371:3:
 required from here
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.h:61:10:
error: invalid use of incomplete type 'struct odb::query_columns<node,
odb::access::object_traits<node> >'
In file included from /usr/include/odb/database.hxx:15:0,
                 from /usr/include/odb/lazy-ptr-impl.txx:5,
                 from /usr/include/odb/lazy-ptr-impl.hxx:176,
                 from /usr/include/odb/lazy-ptr.hxx:15,
                 from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node.h:7,
                 from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.h:21,
                 from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:12:
/usr/include/odb/query.hxx:31:10: error: declaration of 'struct
odb::query_columns<node, odb::access::object_traits<node> >'
In file included from
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.h:380:0,
                 from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.h:25,
                 from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:12:
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.i:18:3:
error: 'id_type' in 'class odb::access::object_traits<group>' does not
name a type
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.i:27:25:
error: 'id_image_type' has not been declared
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.i: In
static member function 'static void
odb::access::object_traits<group>::bind(odb::pgsql::bind*, int&)':
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.i:29:5:
error: incomplete type 'odb::access::object_traits<node>' used in
nested name specifier
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.i: At global scope:
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.i:34:9:
error: variable or field 'init' declared void
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.i:34:9:
error: 'id_image_type' was not declared in this scope
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.i:34:24:
error: 'i' was not declared in this scope
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.i:34:27:
error: expected primary-expression before 'const'
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.i: In
static member function 'static bool
odb::access::object_traits<group>::check_version(const size_t*, const
odb::access::object_traits<group>::image_type&)':
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.i:45:19:
error: 'const struct odb::access::object_traits<group>::image_type'
has no member named 'base'
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.i: In
static member function 'static void
odb::access::object_traits<group>::update_version(std::size_t*, const
odb::access::object_traits<group>::image_type&,
odb::pgsql::binding*)':
/home/mine/git/bettercodes/yajp-backend/odbClasses/group-odb.i:53:16:
error: 'const struct odb::access::object_traits<group>::image_type'
has no member named 'base'
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp: In
static member function 'static void
odb::access::object_traits<node>::groups_traits::init(odb::access::object_traits<node>::groups_traits::value_type&,
const odb::access::object_traits<node>::groups_traits::data_image_type&,
odb::database*)':
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:556:9:
error: 'id_type' is not a member of 'obj_traits {aka
odb::access::object_traits<group>}'
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:556:29:
error: expected ';' before 'id'
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:558:13:
error: 'id_type' is not a member of 'obj_traits {aka
odb::access::object_traits<group>}'
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:558:13:
error: 'id_type' is not a member of 'obj_traits {aka
odb::access::object_traits<group>}'
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:559:30:
error: template argument 1 is invalid
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:559:43:
error: invalid type in declaration before '(' token
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:562:23:
error: expression list treated as compound expression in initializer
[-fpermissive]
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:562:23:
error: left operand of comma operator cannot resolve address of
overloaded function
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:564:46:
error: no matching function for call to
'odb::lazy_weak_ptr<group>::lazy_weak_ptr(odb::database&, <unresolved
overloaded function type>)'
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:564:46:
note: candidates are:
In file included from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node.h:7:0,
                 from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.h:21,
                 from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:12:
/usr/include/odb/lazy-ptr.hxx:598:24: note: template<class Y>
odb::lazy_weak_ptr::lazy_weak_ptr(odb::lazy_weak_ptr<T>::database_type&,
const std::weak_ptr<_Tp1>&)
/usr/include/odb/lazy-ptr.hxx:598:24: note:   template argument
deduction/substitution failed:
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:564:46:
note:   mismatched types 'const std::weak_ptr<_Tp>' and
'odb::access::object_traits<node>::id_type(const
odb::access::object_traits<node>::image_type&) {aka long unsigned
int(const odb::access::object_traits<node>::image_type&)}'
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:564:46:
note:   mismatched types 'const std::weak_ptr<_Tp>' and
'odb::access::object_traits<node>::id_type(const object_type&) {aka
long unsigned int(const node&)}'
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:564:46:
note:   could not resolve address from overloaded function
'odb::access::object_traits<node>::id'
In file included from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node.h:7:0,
                 from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.h:21,
                 from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:12:
/usr/include/odb/lazy-ptr.hxx:597:24: note: template<class Y>
odb::lazy_weak_ptr::lazy_weak_ptr(odb::lazy_weak_ptr<T>::database_type&,
const std::shared_ptr<_Tp1>&)
/usr/include/odb/lazy-ptr.hxx:597:24: note:   template argument
deduction/substitution failed:
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:564:46:
note:   mismatched types 'const std::shared_ptr<_Tp>' and
'odb::access::object_traits<node>::id_type(const
odb::access::object_traits<node>::image_type&) {aka long unsigned
int(const odb::access::object_traits<node>::image_type&)}'
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:564:46:
note:   mismatched types 'const std::shared_ptr<_Tp>' and
'odb::access::object_traits<node>::id_type(const object_type&) {aka
long unsigned int(const node&)}'
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:564:46:
note:   could not resolve address from overloaded function
'odb::access::object_traits<node>::id'
In file included from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node.h:7:0,
                 from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.h:21,
                 from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:12:
/usr/include/odb/lazy-ptr.hxx:596:25: note: template<class ID>
odb::lazy_weak_ptr::lazy_weak_ptr(odb::lazy_weak_ptr<T>::database_type&,
const ID&)
/usr/include/odb/lazy-ptr.hxx:596:25: note:   template argument
deduction/substitution failed:
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:564:46:
note:   couldn't deduce template parameter 'ID'
In file included from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node.h:7:0,
                 from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.h:21,
                 from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:12:
/usr/include/odb/lazy-ptr.hxx:568:24: note: template<class Y>
odb::lazy_weak_ptr::lazy_weak_ptr(const std::shared_ptr<_Tp1>&)
/usr/include/odb/lazy-ptr.hxx:568:24: note:   template argument
deduction/substitution failed:
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:564:46:
note:   'odb::database' is not derived from 'const
std::shared_ptr<_Tp>'
In file included from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node.h:7:0,
                 from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.h:21,
                 from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:12:
/usr/include/odb/lazy-ptr.hxx:567:24: note: template<class Y>
odb::lazy_weak_ptr::lazy_weak_ptr(const std::weak_ptr<_Tp1>&)
/usr/include/odb/lazy-ptr.hxx:567:24: note:   template argument
deduction/substitution failed:
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:564:46:
note:   'odb::database' is not derived from 'const std::weak_ptr<_Tp>'
In file included from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node.h:7:0,
                 from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.h:21,
                 from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:12:
/usr/include/odb/lazy-ptr.hxx:546:24: note: template<class Y>
odb::lazy_weak_ptr::lazy_weak_ptr(const odb::lazy_weak_ptr<Y>&)
/usr/include/odb/lazy-ptr.hxx:546:24: note:   template argument
deduction/substitution failed:
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:564:46:
note:   'odb::database' is not derived from 'const
odb::lazy_weak_ptr<T>'
In file included from /usr/include/odb/lazy-ptr.hxx:643:0,
                 from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node.h:7,
                 from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.h:21,
                 from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:12:
/usr/include/odb/lazy-ptr.ixx:1393:10: note:
odb::lazy_weak_ptr<T>::lazy_weak_ptr(const odb::lazy_weak_ptr<T>&)
[with T = group; odb::lazy_weak_ptr<T> = odb::lazy_weak_ptr<group>]
/usr/include/odb/lazy-ptr.ixx:1393:10: note:   candidate expects 1
argument, 2 provided
In file included from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node.h:7:0,
                 from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.h:21,
                 from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:12:
/usr/include/odb/lazy-ptr.hxx:544:24: note: template<class Y>
odb::lazy_weak_ptr::lazy_weak_ptr(const odb::lazy_shared_ptr<Y>&)
/usr/include/odb/lazy-ptr.hxx:544:24: note:   template argument
deduction/substitution failed:
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:564:46:
note:   'odb::database' is not derived from 'const
odb::lazy_shared_ptr<T>'
In file included from /usr/include/odb/lazy-ptr.hxx:643:0,
                 from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node.h:7,
                 from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.h:21,
                 from
/home/mine/git/bettercodes/yajp-backend/odbClasses/node-odb.cpp:12:
/usr/include/odb/lazy-ptr.ixx:1384:10: note:
odb::lazy_weak_ptr<T>::lazy_weak_ptr() [with T = group]
/usr/include/odb/lazy-ptr.ixx:1384:10: note:   candidate expects 0
arguments, 2 provided
make[2]: *** [CMakeFiles/yajpws.dir/odbClasses/node-odb.cpp.o] Error 1
make[1]: *** [CMakeFiles/yajpws.dir/all] Error 2
make: *** [all] Error 2

node.h:

#ifndef NODE_H
#define NODE_H

#include <string>
#include <vector>
#include <odb/core.hxx>
#include <odb/lazy-ptr.hxx>

#include "activity.h"

class group ;

#pragma db object polymorphic
class node {
public:
        node(   const std::string &hash,
                int creationTime) :
                hash_(hash), creationTime_(creationTime) {}
        virtual ~node() = 0 ;

protected:
        friend class odb::access ;
        node() {}

        #pragma db id auto
        unsigned long id_ ;
        std::string hash_ ;
        int creationTime_ ;
        #pragma db value_not_null
        std::vector<odb::lazy_shared_ptr<activity> > activities_ ;
        #pragma db value_not_null inverse(nodes_)
        std::vector<odb::lazy_weak_ptr<group> > groups_ ;
} ;

#ifdef ODB_COMPILER
#include "group.h"
#endif

#endif // NODE_H


group.h:

#ifndef GROUP_H
#define GROUP_H

#include <vector>
#include <odb/lazy-ptr.hxx>

#include "node.h"

#pragma db object
class group : public node {
public:
        group(  const std::string &hash,
                int creationTime,
                const std::string &title) :
                node(hash,creationTime), title_(title) {}

private:
        friend class odb::access ;
        group() {}

        std::string title_ ;
        #pragma db value_not_null
        std::vector<odb::lazy_shared_ptr<node> > nodes_ ;
} ;

#endif // GROUP_H



2012/6/27 Boris Kolpackov <boris at codesynthesis.com>:
> Hi Miguel,
>
> Miguel Revilla Rodríguez <yo at miguelrevilla.com> writes:
>
>> I have a polymorphic class called 'node':
>>
>> #pragma db object polymorphic
>> class node { ... } ;
>>
>> Now, node is inherited by several other classes (user, group, etc).
>> And one of those classes (group) is a node that defines a group of
>> nodes. I want to set a many-to-many relationship where a group
>> contains a number of nodes and a node belongs to a number of groups.
>
> This is pretty easy to arrange if both node and group are in the same
> header file (generally a good idea when you have such a tight integration
> between the two). The idea is to forward-declare one of the classes:
>
> class group;
>
> class node
> {
>  #pragma db value_not_null inverse(nodes_)
>  std::vector<odb::lazy_weak_ptr<group> > groups_ ;
> };
>
> class group: public node
> {
>  #pragma db value_not_null
>  std::vector<odb::lazy_shared_ptr<node> > nodes_ ;
> };
>
> If you want to place node and group in separate headers, things are
> a bit trickier, but the idea is pretty much the same. You most likely
> need to include the definition of group into node in any case (e.g.,
> for destructors to work, etc). In this case simply #include group.h
> after the node definition:
>
> class group;
>
> class node
> {
>  #pragma db value_not_null inverse(nodes_)
>  std::vector<odb::lazy_weak_ptr<group> > groups_ ;
> };
>
> #include "group.h"
>
> If your application doesn't need group.h in node.h (but the ODB compiler
> does), then you can make the include conditional:
>
> #ifdef ODB_COMPILER
> #  include "group.h"
> #endif
>
> Boris



More information about the odb-users mailing list