Приведение типов в С++
От: Аноним  
Дата: 14.09.05 11:27
Оценка:
Почему VC++ ругается на такой код?

CRITICAL_SECTION csResultGuard;

// ...

EnterCriticalSection( &csResultGuard );


Компилятор говорит, что:
error C2664: 'EnterCriticalSection' : cannot convert parameter 1 from 'const CRITICAL_SECTION *' to 'LPCRITICAL_SECTION'

И что ему здесь не нравится???
Как правильно привести тип в таких случаях? static_cast не проходит, а приведение в стиле С и reinterpret_cast не поощряются.
Re: Приведение типов в С++
От: Cyberax Марс  
Дата: 14.09.05 11:30
Оценка:
Аноним wrote:

> Компилятор говорит, что:

> /error C2664: 'EnterCriticalSection' : cannot convert parameter 1 from
> 'const CRITICAL_SECTION *' to 'LPCRITICAL_SECTION'/
> И что ему здесь не нравится???

Функция, где происходит блокировка, выполняется в константном контексте.
Если критическая секция — член класса, то ее надо объявить как mutable.

> Как правильно привести тип в таких случаях? static_cast не проходит, а

> приведение в стиле С и reinterpret_cast не поощряются.

cons_cast<CRITICAL_SECTION*>(...)

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 2.0 beta
Sapienti sat!
Re: Приведение типов в С++
От: GregZ СССР  
Дата: 14.09.05 11:32
Оценка:
Здравствуйте, Аноним, Вы писали:

Не вижу проблемы в приведенном коде. Скорее всего csResultGuard у тебя объявлена с квалификатором const.
Re[2]: Приведение типов в С++
От: Аноним  
Дата: 14.09.05 11:32
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Аноним wrote:


>> Компилятор говорит, что:

>> /error C2664: 'EnterCriticalSection' : cannot convert parameter 1 from
>> 'const CRITICAL_SECTION *' to 'LPCRITICAL_SECTION'/
>> И что ему здесь не нравится???

C>Функция, где происходит блокировка, выполняется в константном контексте.


Не понял, можно подробнее?

C>Если критическая секция — член класса, то ее надо объявить как mutable.


Да, член класса. А на что это влияет?
Re[2]: Приведение типов в С++
От: Ovl Россия  
Дата: 14.09.05 11:34
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Аноним wrote:


>> Компилятор говорит, что:

>> /error C2664: 'EnterCriticalSection' : cannot convert parameter 1 from
>> 'const CRITICAL_SECTION *' to 'LPCRITICAL_SECTION'/
>> И что ему здесь не нравится???

C>Функция, где происходит блокировка, выполняется в константном контексте.

C>Если критическая секция — член класса, то ее надо объявить как mutable.


угу.
правда, я просто бы попытался убрать константный контекст, а не переделывал переменную.
например — если это происходит в константном экземпляре объекта — сделл бы неконстантный,
если метод класса объявлен с const — убрал бы его. если CRITICAL_SECTION передается куда-нить как const объект —
сделал бы неконстантную ссылку.

C>cons_cast<CRITICAL_SECTION*>(...)


если использовать такое приведение, то потенциально можно пропустить ошибку с модифицированные конст-значением.
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[2]: Приведение типов в С++
От: Аноним  
Дата: 14.09.05 11:48
Оценка:
Здравствуйте, GregZ, Вы писали:

GZ>Здравствуйте, Аноним, Вы писали:


GZ>Не вижу проблемы в приведенном коде. Скорее всего csResultGuard у тебя объявлена с квалификатором const.


csResultGuard объявлена без квалификатора const.
Она является членом класса.
Re[3]: Приведение типов в С++
От: GregZ СССР  
Дата: 14.09.05 11:52
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, GregZ, Вы писали:


GZ>>Здравствуйте, Аноним, Вы писали:


GZ>>Не вижу проблемы в приведенном коде. Скорее всего csResultGuard у тебя объявлена с квалификатором const.


А>csResultGuard объявлена без квалификатора const.

А>Она является членом класса.

Уточнять надо. Я пока еще не пророк.
Проверь квалификатор функции класса в которой вызывается EnterCriticalSection.
Re[3]: Приведение типов в С++
От: Lorenzo_LAMAS  
Дата: 14.09.05 11:55
Оценка:
C>>Функция, где происходит блокировка, выполняется в константном контексте.

А>Не понял, можно подробнее?


class A
{
public:
   void fun()const;
   void fun1();
private:
   int i_;
};

int main()
{
   A a1; //этот объект неконстантен, однако если вызвать fun, то за счет квалификатора const в оъявлении/определении
   //функции, объект (на который будет указывать this) будет считаться константным и потому i_ менять нельзя.
   //выражение &i_ будет иметь тип const int *.

}


А>Да, член класса. А на что это влияет?


На что влияет, вроде сказал, а mutable позволит менять член константного объекта.
Of course, the code must be complete enough to compile and link.
Re: Приведение типов в С++
От: Кодт Россия  
Дата: 14.09.05 12:11
Оценка:
Здравствуйте, Аноним, Вы писали:


А>Почему VC++ ругается на такой код?


А>
А>CRITICAL_SECTION csResultGuard;

А>// ...

А>EnterCriticalSection( &csResultGuard );
А>


А>Компилятор говорит, что:

А>error C2664: 'EnterCriticalSection' : cannot convert parameter 1 from 'const CRITICAL_SECTION *' to 'LPCRITICAL_SECTION'

А>И что ему здесь не нравится???


Он тебе прямым текстом говорит: в данном месте csResultGuard доступен как константа.
Следоательно, ты привёл не весь код, а его куцую часть.
class YourClass
{
  ...
  CRITICAL_SECTION csResultGuard;
  ...
  void some_method() const // *this константный
  {
    ...
    EnterCriticalSection(&csResultGuard); // а следовательно, и все члены объекта доступны как константы
  }
  ...
};

Лечится очень просто. Добавь волшебное слово mutable
class YourClass
{
  ...
  mutable CRITICAL_SECTION csResultGuard;
  ...
  void some_method() const // *this константный
  {
    ...
    EnterCriticalSection(&csResultGuard); // ...все члены, кроме mutable!..
  }
  ...
};


Исправлено форматирование. -- ПК
Перекуём баги на фичи!
Re[3]: Приведение типов в С++
От: Cyberax Марс  
Дата: 14.09.05 14:23
Оценка: +3
Ovl wrote:

> правда, я просто бы попытался убрать константный контекст, а не

> переделывал переменную.

Маленькая заметка: очень часто крит. секции используются для
синхронизации доступа, необходимой и в константных объектах, например,
для поддержки счетчика ссылок. Поэтому их и имеет смысл делать mutable'ными.

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 2.0 beta
Sapienti sat!
Re: Приведение типов в С++
От: Admse  
Дата: 14.09.05 15:39
Оценка:
Здравствуйте, Аноним, Вы писали:


А>Почему VC++ ругается на такой код?


А>
А>CRITICAL_SECTION csResultGuard;

А>// ...

А>EnterCriticalSection( &csResultGuard );
А>


А>Компилятор говорит, что:

А>error C2664: 'EnterCriticalSection' : cannot convert parameter 1 from 'const CRITICAL_SECTION *' to 'LPCRITICAL_SECTION'

А>И что ему здесь не нравится???

А>Как правильно привести тип в таких случаях? static_cast не проходит, а приведение в стиле С и reinterpret_cast не поощряются.

похоже вам необходимо использовать const_cast, так как вы пытаетесь преобразовать константный объект к неконстантному (LPCRITICAL_SECTION — указатель на объект, а не указатель на костантный объект)
Re: Приведение типов в С++
От: MaximE Великобритания  
Дата: 14.09.05 20:19
Оценка:
On Wed, 14 Sep 2005 15:27:54 +0400, wrote:

> Компилятор говорит, что:

> error C2664: 'EnterCriticalSection' : cannot convert parameter 1 from 'const CRITICAL_SECTION *' to 'LPCRITICAL_SECTION'
>
> И что ему здесь не нравится???

А что тебе непонятно в сообщении об ошибке?

Ф-ция принимает указатель на не константу, а ты передаешь туда указатель на константу.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.