STL作为静态volatile成员的问题

时间:2011-01-27 02:51:59

标签: c++

我正在尝试编译这样的东西:


#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

我做错了什么? 编辑:使用&lt;修复了一些格式错误和&gt;
EDIT2:threadList受互斥锁保护,我只是为了简单起见而没有把它放在这里

3 个答案:

答案 0 :(得分:4)

删除volatile并删除问题。因此,对于真正的答案,如果您解释为什么需要挥发性,以及它在此意味着什么,它可能会有所帮助。它不会使整个列表被视为易失性。

另见previous answer

答案 1 :(得分:4)

首先,volatile可能是最不了解的关键字,而且很可能 NOT 按照您的想法行事。我了解了hard way

话虽如此,问题是volatile也可以用作函数的限定符,以确保它们在正确的上下文中被调用。 push_back()函数未使用volatile限定符声明,因此在volatile对象上调用它是无效的。只能为非易失性对象调用非易失性成员函数。

答案 2 :(得分:2)

使用g ++编译它会给出

  

test.cpp:13:错误:传递'volatile   std :: list&gt;'as'this'   'void std :: list&lt; _Tp的参数,   _Alloc&gt; :: push_back(const _Tp&amp;)[with _Tp = thread *,_ Alloc = std :: allocator]'丢弃   预选赛   ...

discards qualifiers是你的提示。无法在list::push_backconst个实例上调用volatile函数。

一种方法:

  • 将列表设为私有
  • 创建私有静态互斥
  • 创建addremove
  • 的静态公共函数
  • addremove获取锁定,然后在列表中添加或删除