The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"преобразование sometype* в somenmsp::sometype*"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"преобразование sometype* в somenmsp::sometype*"  
Сообщение от sherzod (ok) on 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*
    
как быть?

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

http://soci.sourceforge.net/

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "преобразование sometype* в somenmsp::sometype*"  
Сообщение от elvenic (??) on 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.


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "преобразование sometype* в somenmsp::sometype*"  
Сообщение от sherzod (ok) on 07-Янв-09, 19:54 
>[оверквотинг удален]
>>typedef pg_conn PGconn;
>>
>>я делаю предварительно объявление этого типа чтобы не шарить его в глобальный
>>namespace
>>namespace db{
>>
>> struct PGconn;
>>
>
>А вот этого делать не надо.

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

struct PGconn;

namespace db {

   ...

}


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "преобразование sometype* в somenmsp::sometype*"  
Сообщение от elvenic (??) on 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);    
}

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "преобразование sometype* в somenmsp::sometype*"  
Сообщение от elvenic (??) on 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'.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "преобразование sometype* в somenmsp::sometype*"  
Сообщение от sherzod (ok) on 07-Янв-09, 23:03 

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру