[odb-users] Is this possible?

Miguel Revilla Rodríguez yo at miguelrevilla.com
Wed Jun 27 11:09:57 EDT 2012


If both class declarations are in the same file (your first advice)
everything works fine. Using that as a workaround while we get a fix.

Thanks!


2012/6/27 Miguel Revilla Rodríguez <yo at miguelrevilla.com>:
> 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