2011-01-27 2 views
0

Я пытаюсь собрать что-то вроде этого:Проблемы с СТЛ как статический член летучего


#include <list> 

class thread 
{ 
public: 
static volatile std::list<thread *> threadList; //This is also protected by a mutex 
}; 
volatile std::list<thread *> thread::threadList; 

void main() 
{ 
thread A; 
thread::threadList.push_back(&A); 
thread::threadList.remove(&A); 
}

я получаю эти ошибки при попытке компиляции:


test.cpp(14): error C2663: 'std::list::push_back' : 2 overloads have no legal conversion for 'this' pointer 
      with 
      [ 
       _Ty=thread * 
      ] 
test.cpp(15): error C2662: 'std::list::remove' : cannot convert 'this' pointer from 'volatile std::list' to 'std::list &' 
      with 
      [ 
       _Ty=thread * 
      ] 
      Conversion loses qualifiers

Что я делаю неправильно?
EDIT: исправлены некоторые ошибки форматирования с < и>
EDIT2: цепочек защищен взаимной блокировкой, я просто не поставил его здесь для простоты

+1

Почему вы используете нестабильную? –

+0

Я держу пари, что ему нужен список всех C++ 0x или boost 'thread', который у него есть, и он хочет, чтобы контейнер держал их в синхронизации. – KitsuneYMG

ответ

4

Удалить энергозависимой и снять проблему. Поэтому для реального ответа это может помочь, если вы объясните, почему вам нужно изменчиво, и что здесь подразумевается здесь. Это не приведет к тому, что весь список будет считаться изменчивым.

Смотрите также previous answer

+0

Я использую volatile, потому что список будет использоваться несколькими потоками. Также этот код упрощен; мой фактический код имеет список, защищенный мьютексом. Теперь, когда я думаю об этом, волатильность даже может иметь значение в этом случае? – Mark

+1

@Mark: Нет. Если у вас есть замок вокруг него, 'volatile' не требуется для простой защиты доступа. – JaredC

+1

@ Mark-Volatile не сделает поток векторным. Вам нужно будет использовать явные блокировки. Обычно «volatile» означает «не оптимизировать чтение и запись этого значения, потому что он может быть изменен из какого-либо другого пространства», а не «предотвращать прикосновение нескольких потоков к этой переменной».« – templatetypedef

2

Использование г ++ скомпилировать это дает

test.cpp:13: error: passing ‘volatile std::list >’ as ‘this’ argument of ‘void std::list<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = thread*, _Alloc = std::allocator]’ discards qualifiers ...

discards qualifiers твой намек. Функция list::push_back не может быть вызвана на const или volatile экземплярах.

Один из способов сделать это:

  • сделать список частный
  • создать частный статический мьютекс
  • создать статическую общественную функцию, которая add и remove
  • в add и remove приобрести замок , затем добавьте или удалите из списка
4

Прежде всего, volatile возможно наименее понятное ключевое слово, и его более чем вероятно NOT делать то, что вы думаете. Я узнал об этом hard way.

При этом проблема заключается в том, что volatile также может использоваться в качестве классификатора функций, чтобы гарантировать, что они вызываются в правильном контексте. Функция push_back() не объявлена ​​с помощью квалификатора volatile, поэтому вызов его на объект volatile недействителен. Функция энергонезависимого члена может быть вызвана только для энергонезависимого объекта.

Смежные вопросы