[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