- преобразование sometype* в somenmsp::sometype*, vic, 18:53 , 07-Янв-09 (1)
>привет всем > >такая задачка не соображу >пишу с++ раппер для libpq (postgres c api) http://pqxx.tk/ все уже сделано до нас :)
- преобразование sometype* в somenmsp::sometype*, sherzod, 19:08 , 07-Янв-09 (2)
>>привет всем >> >>такая задачка не соображу >>пишу с++ раппер для libpq (postgres c api) > >http://pqxx.tk/ все уже сделано до нас :) за ссылку спасибо) но задача не сколько в том чтобы получить с++ апи на postgres, как в том чтобы решить указанную проблему в общем случае
- преобразование sometype* в somenmsp::sometype*, elvenic, 19:43 , 07-Янв-09 (3)
>[оверквотинг удален] >в 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.
- преобразование sometype* в somenmsp::sometype*, sherzod, 19:54 , 07-Янв-09 (4)
>[оверквотинг удален] >>typedef pg_conn PGconn; >> >>я делаю предварительно объявление этого типа чтобы не шарить его в глобальный >>namespace >>namespace db{ >> >> struct PGconn; >> > >А вот этого делать не надо. дело в том что я скрываю весь с апи в cpp файле то есть подключаю хедер cодержащий PGconn в cpp файле поэтому мне необходимо объявить предварительно тип PGconn чтобы обяъвить указатель на него m_connection в описании class dbpgengine;
- преобразование sometype* в somenmsp::sometype*, elvenic, 22:10 , 07-Янв-09 (5)
>[оверквотинг удален] >>> >> >>А вот этого делать не надо. > >дело в том что я скрываю весь с апи в cpp файле > >то есть подключаю хедер cодержащий PGconn в cpp файле >поэтому мне необходимо объявить предварительно тип PGconn чтобы обяъвить указатель на него > >m_connection в описании class dbpgengine; Ну тогда вынесите это определение в вашем header-файле вне namespace db: struct PGconn; namespace db { ... }
- преобразование sometype* в somenmsp::sometype*, elvenic, 22:18 , 07-Янв-09 (6)
>[оверквотинг удален] > >Ну тогда вынесите это определение в вашем 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); }
- преобразование sometype* в somenmsp::sometype*, elvenic, 22:23 , 07-Янв-09 (7)
> >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'. - преобразование sometype* в somenmsp::sometype*, sherzod, 23:03 , 07-Янв-09 (8)
>> >>Ну тогда вынесите это определение в вашем header-файле вне namespace db: >> > >Или, как альтернатива, опишите m_connection в вашем классе как void *: >спасибо но эти варианты не подходят по следующим причинам 1 вариант - описывает идентификатор в глобальном пространстве имен 2 вариант создает лишности с приведениями указателей 3 есть еще паттерн мост но можно ли без добавления дополнительного слоя классов (то есть лишь языковыми средствами это сделать)?
|