Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Старые исходники не компилируются


Автор: v00d00 26.10.2009, 18:58
Потребовалось откопать для работы в Delphi (внимение. да я не дружу с С++). Пример для работы с древним апи ODMA.

Пытаюсь в 2008 вижуал студии собрать исходник ODMA connection manager.

Выдает следующую ошибку:

Код

Error    12    error C2664: 'ODMDmsList::Remove' : cannot convert parameter 1 from 'ODMDms *' to 'const ODMDms *&' 


и еще парочку аналогичных. Как с этим бороться?

Возможно пригодятся исходники

Определение 
Код

void Remove( const ODMDms*& rItem )
    {
      ...
    }



Вызов
Код


     ODMDms* pDms = iterator.Current();     // The DMS to call for results      
     m_pObject->m_queryDmss.Remove(pDms);





Автор: v00d00 26.10.2009, 19:16
Что это вообще за ад?
Код

const ODMDms*& rItem


Автор: zim22 26.10.2009, 19:17
Код

const ODMDms* pDms = iterator.Current();    

***
Цитата(v00d00 @  26.10.2009,  18:16 Найти цитируемый пост)
Что это вообще за ад?

это ад С++ smile
читается справа на лево: rItem является ссылкой на указатель на тип ODMDms, который является константой
оператор ссылка (&) нужен для того, чтобы можно было изменить адрес указателя, переданного в функцию

Автор: v00d00 27.10.2009, 16:13
разве const не противоречит &?

Видимо в более ранней версии компилятора от мелкософта такой синтаксис считался нормой.
В новой версии это отказывается компилироваться. Почему? 

Как в вызове правильно привести тип?

Добавлено через 6 минут и 52 секунды
а вообще это по смыслу эквивалентно 
Код

const ODMDms** rItem

Единственное отличие в том что в коде не придется разыменовывать адресс для работы с указателем...


Тааак. А почему же оно не компилируется? Вроде данные передаются правильно...

Автор: v00d00 27.10.2009, 16:33
Вопрос.

Как правильно передать параметр в функцию с заголовком такого вида
Код

void foo(const integer*& item)
{
  ...
}


Добавлено @ 16:38
Получилось только так: 
Код

            const ODMDms* param = pDms;
            m_pObject->m_queryDmss.Remove(param);


но это имхо бред. в вызове кастануть тип не получается


Автор: bsa 27.10.2009, 23:58
Скорее всего данное API является ошибкой. Так как скорее всего речь идет о константной ссылке, которая из-за использования препроцессора превратилась в ссылку на константный указатель. Короче, твое решение единственно правильное, если не менять API.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)