The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
преобразование 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, 18:53 , 07-Янв-09 (1)
    >привет всем
    >
    >такая задачка не соображу
    >пишу с++ раппер для libpq (postgres c api)

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

  • преобразование 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 есть еще паттерн мост
            но можно ли без добавления дополнительного слоя классов (то есть лишь языковыми средствами это сделать)?




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

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