Как получить целую строку из базы данных с помощью SOCI?

… и сохранить его в самоопределяемый тип объекта? Я использую PostgreSQL. Когда у меня все в одном файле, это работает. Но я хотел разделить это на файлы классов, как вы всегда делаете, когда пишете в cpp. Когда я делю свой код на файлы * .h и * .cpp, я получаю ошибки.

Вот мои файлы:

test.h

class MyInt
{
public:
MyInt();
MyInt(int i);

void set(int i);
int get() const;

private:
int i_;
};

test.cpp

#include "test.h"#include <soci.h>
#include <postgresql/soci-postgresql.h>

MyInt::MyInt()
{

}

MyInt::MyInt(int i)
{
this->i_ = i;
}

int MyInt::get() const
{
return this->i_;
}

void MyInt::set(int i)
{
this->i_ - i;
}

namespace soci
{
template <>
struct type_conversion<MyInt>
{
typedef int base_type;

static void from_base(int i,  soci::indicator ind, MyInt & mi)
{
if (ind ==  soci::i_null)
{
throw soci_error("Null value not allowed for this type");
}

mi.set(i);
}

static void to_base(const MyInt & mi, int & i,  soci::indicator & ind)
{
i = mi.get();
ind = soci::i_ok;
}
};
}

main.cpp

#include <iostream>
#include "test.h"
int main(int argc, char **argv)
{

MyInt i;
sql.open(soci::postgresql, "dbname=mydb user=postgres password=postgrespass");
sql << "SELECT count(*) FROM person;", soci::into(i);
std::cout << "We have " << i.get() << " persons in the database.\n";
sql.close();

return 0;
}

Я компилирую это так:

g ++ main_test.cpp test.h test.cpp -o Приложение -lsoci_core -lsoci_postgresql
-ldl -lpq -I / usr / local / include / soci -I / usr / include / postgresql

и получил эти ошибки:

In file included from /usr/local/include/soci/into-type.h:13:0,
from /usr/local/include/soci/blob-exchange.h:12,
from /usr/local/include/soci/soci.h:18,
from main_test.cpp:3:
/usr/local/include/soci/exchange-traits.h: In instantiation of â€soci::details::exchange_traits<MyInt>’:
/usr/local/include/soci/into.h:29:60:   instantiated from â€soci::details::into_type_ptr soci::into(T&) [with T = MyInt, soci::details::into_type_ptr = soci::details::type_ptr<soci::details::into_type_base>]’
main_test.cpp:29:59:   instantiated from here
/usr/local/include/soci/exchange-traits.h:35:5: error: incomplete type â€soci::details::exchange_traits<MyInt>’ used in nested name specifier

ВЫШЕ ПРОБЛЕМА РЕШЕНА, ПОСМОТРИТЕ НА ОТВЕТ @JohnBandela.

0

Решение

Код, на котором вы специализируете type_conversion

template<>
struct type_conversion<MyInt>

Должен быть в test.h, а не в test.cpp. Проблема в том, что если он у вас в test.cpp, как у вас сейчас, он не виден в main.cpp, где вы используете SOCI

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]