[odb-users] reuse inheritance with templated base class

Boris Kolpackov boris at codesynthesis.com
Wed Aug 13 08:02:34 EDT 2014


Hi Marcel,

Marcel Nehring <mne at qosmotec.com> writes:

> One of my template classes has a member of type std::map<unsigned int, 
> std::pair<T, std::string>>. ODB could not persist this automatically,
> so I put the following inside the class' definition:
> 
> typedef std::pair<T, std::string> Item;
> #pragma db value(Item)
> 
> And changed the member declaration to std::map<unsigned int, Item>
> 
> However, this too does not work and gives me a "unable to instantiate 
> composite value class template" error for the typedef line. Any ideas?

I probably haven't explained this well enough in my previous emails.
ODB only operates on class template instantiations. It doesn't process
class templates themselves. So having something like this in a class
template:

typedef std::pair<T, std::string> Item;
#pragma db value(Item)

doesn't tell ODB anything since this is itself a template (it is
inside a template and depends on the template parameter T). What you
need to do is have the value pragma for the instantiation of this.
Here is what I mean:

template <typename T>
class base
{
  typedef std::pair<T, std::string> Item;   
  //#pragma db value(Item) // This won't work, Item is a "template".

  std::map<unsigned int, Item> map;
};

typedef base<int> int_base;
#pragma db object(int_base)

#pragma db value(int_base::Item); // This will work, int_base::Item is
                                  // an instantiation.

Boris



More information about the odb-users mailing list