привет всемтакая задачка не соображу
пишу с++ раппер для libpq (postgres c api)все классы объявляю в namespace db;
в header файле postgres объявлен следующий тип
typedef pg_conn PGconn;
я делаю предварительно объявление этого типа чтобы не шарить его в глобальный namespace
// pgengine.h
namespace db{
struct PGconn;class dbpgengine{
public:
// tralalya topolya
private:
PGconn* m_connection;
};}
// pgengine.cpp
using namespace db;dbpgengine::some_func(){
m_connection = PGconnectdb(...);
//...
}выдает ошибку
не могу преобразовать PGconn* в db::PGconn*
как быть?
>привет всем
>
>такая задачка не соображу
>пишу с++ раппер для libpq (postgres c api)http://pqxx.tk/ все уже сделано до нас :)
>>привет всем
>>
>>такая задачка не соображу
>>пишу с++ раппер для libpq (postgres c api)
>
>http://pqxx.tk/ все уже сделано до нас :)за ссылку спасибо)
но задача не сколько в том чтобы получить с++ апи на postgres, как в том чтобы решить указанную проблему в общем случае
[...]
>но задача не сколько в том чтобы получить с++ апи на postgres,
>как в том чтобы решить указанную проблему в общем случае
>[оверквотинг удален]
>в header файле postgres объявлен следующий тип
>
>typedef pg_conn PGconn;
>
>я делаю предварительно объявление этого типа чтобы не шарить его в глобальный
>namespace
>namespace db{
>
> struct PGconn;
>А вот этого делать не надо.
Имя PGConn уже присутствует в глобальном namespace'е - поскольку так его об'явили в header файле postgres.
И более того, в соответствии с об'явлением функции PGconnectdb() в том же header файле postgres, эта функция возвращает значение типа PGconn*, а не db::PGconn*. Именно это и сообщает вам компилятор:
>
>выдает ошибку
>
> не могу преобразовать PGconn* в db::PGconn*
>
>как быть?Не определять struct PGconn в неймспейсе db.
Если очень хочется иметь _синоним_ типа struct PGconn в неймспейсе db, можно сказать там typedef:
#include <some_postgress_header_file_where_PGconn_is_defined.h>
namespace db {
typedef ::PGconn PGconn;
}
Но это, вообще говоря, нафиг никому не надо.
Thank you,alex.
>[оверквотинг удален]
>>typedef pg_conn PGconn;
>>
>>я делаю предварительно объявление этого типа чтобы не шарить его в глобальный
>>namespace
>>namespace db{
>>
>> struct PGconn;
>>
>
>А вот этого делать не надо.дело в том что я скрываю весь с апи в cpp файле
то есть подключаю хедер cодержащий PGconn в cpp файле
поэтому мне необходимо объявить предварительно тип PGconn чтобы обяъвить указатель на него
m_connection в описании class dbpgengine;
>[оверквотинг удален]
>>>
>>
>>А вот этого делать не надо.
>
>дело в том что я скрываю весь с апи в cpp файле
>
>то есть подключаю хедер cодержащий PGconn в cpp файле
>поэтому мне необходимо объявить предварительно тип PGconn чтобы обяъвить указатель на него
>
>m_connection в описании class dbpgengine;Ну тогда вынесите это определение в вашем header-файле вне namespace db:
struct PGconn;
namespace db {
...
}
>[оверквотинг удален]
>
>Ну тогда вынесите это определение в вашем header-файле вне namespace db:
>
>struct PGconn;
>
>namespace db {
>
> ...
>
>}Или, как альтернатива, опишите m_connection в вашем классе как void *:
namespace db {
class dbpgengine{
public:
// tralalya topolya
private:
void* m_connection;
};
}а в cpp файле:
// pgengine.cpp
#include <some_postgress_headers.h>using namespace db;
dbpgengine::some_func(){
m_connection = PGconnectdb(...);
//...
}dbpengine::some_other_func()
{
// to call postgress api function that requires
// connection pointer:
PG_some_func(static_cast<PGconn>(m_connection), other, params);
}
>
>dbpengine::some_other_func()
>{
> // to call postgress api function that requires
>
> // connection pointer:
> PG_some_func(static_cast<PGconn>(m_connection), other, params);
>}Sorry: static_cast<PGconn *>(...) - нужно привести к виду 'указатель на PGconn', а не просто 'PGconn'.
>>
>>Ну тогда вынесите это определение в вашем header-файле вне namespace db:
>>
>
>Или, как альтернатива, опишите m_connection в вашем классе как void *:
>спасибо
но эти варианты не подходят по следующим причинам
1 вариант - описывает идентификатор в глобальном пространстве имен
2 вариант создает лишности с приведениями указателей
3 есть еще паттерн мост
но можно ли без добавления дополнительного слоя классов (то есть лишь языковыми средствами это сделать)?