我正在尝试编译这样的东西:
#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受互斥锁保护,我只是为了简单起见而没有把它放在这里
答案 0 :(得分:4)
删除volatile并删除问题。因此,对于真正的答案,如果您解释为什么需要挥发性,以及它在此意味着什么,它可能会有所帮助。它不会使整个列表被视为易失性。
答案 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_back
或const
个实例上调用volatile
函数。
一种方法:
add
和remove
add
和remove
获取锁定,然后在列表中添加或删除