URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7815
[ Назад ]

Исходное сообщение
"преобразование sometype* в somenmsp::sometype*"

Отправлено sherzod , 07-Янв-09 17:50 
привет всем

такая задачка не соображу
пишу с++ раппер для 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*
    
как быть?


Содержание

Сообщения в этом обсуждении
"преобразование sometype* в somenmsp::sometype*"
Отправлено vic , 07-Янв-09 18:53 
>привет всем
>
>такая задачка не соображу
>пишу с++ раппер для libpq (postgres c api)

http://pqxx.tk/ все уже сделано до нас :)


"преобразование sometype* в somenmsp::sometype*"
Отправлено sherzod , 07-Янв-09 19:08 
>>привет всем
>>
>>такая задачка не соображу
>>пишу с++ раппер для libpq (postgres c api)
>
>http://pqxx.tk/ все уже сделано до нас :)

за ссылку спасибо)
но задача не сколько в том чтобы получить с++ апи на postgres, как в том чтобы решить указанную проблему в общем случае


"преобразование sometype* в somenmsp::sometype*"
Отправлено phpcoder , 08-Янв-09 00:26 
[...]
>но задача не сколько в том чтобы получить с++ апи на postgres,
>как в том чтобы решить указанную проблему в общем случае

http://soci.sourceforge.net/


"преобразование sometype* в somenmsp::sometype*"
Отправлено elvenic , 07-Янв-09 19:43 
>[оверквотинг удален]
>в 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 , 07-Янв-09 19:54 
>[оверквотинг удален]
>>typedef pg_conn PGconn;
>>
>>я делаю предварительно объявление этого типа чтобы не шарить его в глобальный
>>namespace
>>namespace db{
>>
>> struct PGconn;
>>
>
>А вот этого делать не надо.

дело в том что я скрываю весь с апи в cpp файле
то есть подключаю хедер cодержащий PGconn в cpp файле
поэтому мне необходимо объявить предварительно тип PGconn чтобы обяъвить указатель на него
m_connection в описании class dbpgengine;


"преобразование sometype* в somenmsp::sometype*"
Отправлено elvenic , 07-Янв-09 22:10 
>[оверквотинг удален]
>>>
>>
>>А вот этого делать не надо.
>
>дело в том что я скрываю весь с апи в cpp файле
>
>то есть подключаю хедер cодержащий PGconn в cpp файле
>поэтому мне необходимо объявить предварительно тип PGconn чтобы обяъвить указатель на него
>
>m_connection в описании class dbpgengine;

Ну тогда вынесите это определение в вашем header-файле вне namespace db:

struct PGconn;

namespace db {

   ...

}



"преобразование sometype* в somenmsp::sometype*"
Отправлено elvenic , 07-Янв-09 22:18 
>[оверквотинг удален]
>
>Ну тогда вынесите это определение в вашем 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 , 07-Янв-09 22:23 
>
>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 , 07-Янв-09 23:03 

>>
>>Ну тогда вынесите это определение в вашем header-файле вне namespace db:
>>
>
>Или, как альтернатива, опишите m_connection в вашем классе как void *:
>

спасибо
но эти варианты не подходят по следующим причинам
1 вариант - описывает идентификатор в глобальном пространстве имен
2 вариант создает лишности с приведениями указателей
3 есть еще паттерн мост
но можно ли без добавления дополнительного слоя классов (то есть лишь языковыми средствами это сделать)?