Ovl wrote:
> правда, я просто бы попытался убрать константный контекст, а не > переделывал переменную.
Маленькая заметка: очень часто крит. секции используются для
синхронизации доступа, необходимой и в константных объектах, например,
для поддержки счетчика ссылок. Поэтому их и имеет смысл делать mutable'ными.
Компилятор говорит, что: error C2664: 'EnterCriticalSection' : cannot convert parameter 1 from 'const CRITICAL_SECTION *' to 'LPCRITICAL_SECTION'
И что ему здесь не нравится???
Как правильно привести тип в таких случаях? static_cast не проходит, а приведение в стиле С и reinterpret_cast не поощряются.
Аноним wrote:
> Компилятор говорит, что: > /error C2664: 'EnterCriticalSection' : cannot convert parameter 1 from > 'const CRITICAL_SECTION *' to 'LPCRITICAL_SECTION'/ > И что ему здесь не нравится???
Функция, где происходит блокировка, выполняется в константном контексте.
Если критическая секция — член класса, то ее надо объявить как mutable.
> Как правильно привести тип в таких случаях? static_cast не проходит, а > приведение в стиле С и reinterpret_cast не поощряются.
Не вижу проблемы в приведенном коде. Скорее всего 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.
Здравствуйте, 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*>(...)
если использовать такое приведение, то потенциально можно пропустить ошибку с модифицированные конст-значением.
Здравствуйте, GregZ, Вы писали:
GZ>Здравствуйте, Аноним, Вы писали:
GZ>Не вижу проблемы в приведенном коде. Скорее всего csResultGuard у тебя объявлена с квалификатором const.
csResultGuard объявлена без квалификатора const.
Она является членом класса.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, GregZ, Вы писали:
GZ>>Здравствуйте, Аноним, Вы писали:
GZ>>Не вижу проблемы в приведенном коде. Скорее всего csResultGuard у тебя объявлена с квалификатором const.
А>csResultGuard объявлена без квалификатора const. А>Она является членом класса.
Уточнять надо. Я пока еще не пророк.
Проверь квалификатор функции класса в которой вызывается EnterCriticalSection.
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.
А>Компилятор говорит, что: А>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
А>Компилятор говорит, что: А>error C2664: 'EnterCriticalSection' : cannot convert parameter 1 from 'const CRITICAL_SECTION *' to 'LPCRITICAL_SECTION'
А>И что ему здесь не нравится??? А>Как правильно привести тип в таких случаях? static_cast не проходит, а приведение в стиле С и reinterpret_cast не поощряются.
похоже вам необходимо использовать const_cast, так как вы пытаетесь преобразовать константный объект к неконстантному (LPCRITICAL_SECTION — указатель на объект, а не указатель на костантный объект)
On Wed, 14 Sep 2005 15:27:54 +0400, wrote:
> Компилятор говорит, что: > error C2664: 'EnterCriticalSection' : cannot convert parameter 1 from 'const CRITICAL_SECTION *' to 'LPCRITICAL_SECTION' > > И что ему здесь не нравится???
А что тебе непонятно в сообщении об ошибке?
Ф-ция принимает указатель на не константу, а ты передаешь туда указатель на константу.