У меня очень простая установка отношений, которую я не могу заставить выводить odb для компиляции, и это дает мне ошибку ниже компилятора. Я использую умные указатели Qt для реализации отношений, и мне всегда кажется, что я сталкиваюсь с одной и той же ошибкой, независимо от того, сколько перестановок я прохожу.
/usr/local/include/odb/database.ixx:570:54: error: no matching function for call to ‘odb::object_traits_impl<Inspection, (odb::database_id)1u>::find(odb::database&, const id_type&)’
вот родительский класс
#ifndef PART_H
#define PART_H
class Part;
#include <odb/core.hxx>
#include <odb/qt/lazy-ptr.hxx>
#include <QtCore/QString>
#include <QtCore/QByteArray>
#include <QtCore/QUuid>
#include <QtCore/QDateTime>
#include <QtCore/QSharedPointer>
#include <QtCore/QList>
#include <QtCore/QSet>
#include "Inspection.h"
/** this class represents the atomic parts which are acquired */
#pragma db object
class Part{
public:
/** public constructor */
Part(QString id);
/** gets the id */
const QString Id() const;
/** Get (or create) the inspection for a given system name */
QSharedPointer<Inspection> GetInspection(QString systemName = "");
private:
/** constructor */
Part(){}
/** odb needed reference */
friend class odb::access;
/** a list of all of the inspections for this part */
//#pragma db value_not_null inverse(parent)
QList<QSharedPointer<Inspection> > inspections;
/** holds a unique name/id for this object */
#pragma db id
QString id;
};
#endif // PART_H
А вот и ребенок
#ifndef INSPECTION_H
#define INSPECTION_H
class Inspection;
#include <odb/core.hxx>
#include <odb/qt/lazy-ptr.hxx>
#include <QtCore/QString>
#include <QtCore/QByteArray>
#include <QtCore/QUuid>
#include <QtCore/QDateTime>
#include <QtCore/QSharedPointer>
#include <QtCore/QList>
#include <QtCore/QSet>
//#include "SurfaceDefect.h"#include "vec2f.h"#include "Part.h"#include "MILImage.h"
using namespace std;
#pragma db object
class Inspection{
public:
/** gets the full image object for this inspection */
const QWeakPointer<MILImage> GetFullImage() const;
/** gets the start time of the inspection */
const QDateTime GetStarted() const;
/** gets the end time of the inspection */
const QDateTime GetEnded() const;
/** Gets the system name on which the inspection was acquired */
const QString GetSystemName() const;
/** sets the full image and takes ownership of it */
void SetFullImage(MILImage* fullImage);
/** sets the start time of the inspection */
void SetStarted(QDateTime started);
/** Sets the end time of the inspection */
void SetEnded(QDateTime ended);
private:
/** constructor */
Inspection(QString systemName);
/** odb needed reference */
friend class odb::access;
/** we give access to the part class to allow for construction */
friend class Part;
/** A unique identifier for the inspection */
#pragma db id
QUuid id;
/** the name of the system which acquired the inspection */
QString systemName;
/** The time and date the inspection was recorded to disk */
QDateTime Recorded;
/** A vector of all defects */
//#pragma db inverse(Source)
//QVector< QLazyWeakPointer<SurfaceDefect> > SurfaceDefects;
/** The username of the person inspecting the sheet */
QString Username;
/** All the metadata crammed into one QString */
QString MetaData;
/** The positions of the 4 corners of a sheet */
// TODO: this should not be transient
#pragma db transient
Vec2f Corners[4];
/** The time and date the inspection started */
QDateTime started;
/** the time and date the inspection ended */
QDateTime ended;
/** the full inspection image */
#pragma db transient
QSharedPointer<MILImage> fullImage;
/** the parent part of this object */
#pragma db not_null
QSharedPointer<Part> parent;
};
#endif // INSPECTION_H
Любая помощь, которая может быть оказана, будет великолепна!
Мне удалось получить обратную связь от разработчика ODB, который заявил, что это может произойти, когда не удается создать конструктор по умолчанию, как я делал в классе Inspection. Спасибо Борис!