C++ 无法推送到由静态映射创建的队列<;结构、队列>;

C++ 无法推送到由静态映射创建的队列<;结构、队列>;,c++,static,map,struct,queue,C++,Static,Map,Struct,Queue,所以基本上我有一个静态映射,它将我的结构映射到一个队列,但是当我尝试推送到队列时,它无法推送任何东西 struct SignalID_t { unsigned int lock; unsigned int cond; SignalID_t(unsigned int lock_, unsigned int cond_):lock(lock_), cond(cond_) {} }; class SignalIDComp { public: bool operator()(

所以基本上我有一个静态映射,它将我的结构映射到一个队列,但是当我尝试推送到队列时,它无法推送任何东西

struct SignalID_t {
    unsigned int lock;
    unsigned int cond;

    SignalID_t(unsigned int lock_, unsigned int cond_):lock(lock_), cond(cond_) {}
};

class SignalIDComp {
public:
bool operator()(const SignalID_t& a, const SignalID_t& b) const
    {return a.lock == b.lock && a.cond == b.cond;}
}; 

class ThreadManager{
public:

static std::queue<ucontext_t *>& waitingQ(SignalID_t id)
    {return threadsWaitingOnConditions[id];}

private:
    static std::map<SignalID_t, std::queue<ucontext_t*>> threadsWaitingOnConditions;
}

map<SignalID_t, queue<ucontext_t *>, SignalIDComp>    ThreadManager::threadsWaitingOnConditions;

class Threads{

void thread_wait(int lock, int cond){
    SignalID_t id(lock, cond);
    ThreadManager::waitingQ(id).push(ThreadManager::getRunningThread());
    if (ThreadManager::waitingQ(id).empty())
       cout << "failed to push thread to cond waiting Q" << endl;
}
}
struct SignalID\u t{
无符号整数锁;
无符号整数秒;
SignalID_t(unsigned int lock_,unsigned int cond_):lock(lock_),cond(cond_){
};
类信号综合{
公众:
布尔运算符()
{返回a.lock==b.lock&&a.cond==b.cond;}
}; 
类线程管理器{
公众:
静态标准::队列和等待Q(信号id\u t id)
{返回threadswaitingconditions[id];}
私人:
静态std::映射线程waitingconditions;
}
映射ThreadManager::ThreadsWaitingConditions;
类线程{
无效线程\u等待(int lock,int cond){
信号id\u t id(锁定,状态);
ThreadManager::waitingQ(id).push(ThreadManager::getRunningThread());
if(ThreadManager::waitingQ(id).empty())

cout您有两个独立的对象,不幸的是,它们的名称相同:

map_type ThreadManager::threadsWaitingOnConditions;

你把两者混淆了。最后的检查应该是:

if (ThreadManager::threadsWaitingOnConditions[id].empty()) { /* ... */ }
或者类似的东西。鉴于静态成员映射是私有的,您可能应该说

if (ThreadManager::waitingQ(id).empty()) { /* ... */ }
我不明白您对全局映射对象有什么需要。它似乎不必要。或者更确切地说,您的意思是它是静态成员对象的定义,在这种情况下,您应该这样编写它:

map<SignalID_t, std::queue<ucontext_t*>> ThreadManager::threadsWaitingOnConditions;
//                                       ^^^^^^^^^^^^^^^
map ThreadManager::threadswaitingconditions;
//                                       ^^^^^^^^^^^^^^^

啊,对此很抱歉,但这些事情大多反映了我手动重新创建代码,而不是复制和粘贴代码。我相信问题的当前状态反映了大部分更改,推送仍然无法工作。好吧,您当前的代码甚至不应该编译,因为您没有函数
ThreadM管理器::getRunningThread()
。我应该要求您发布工作中的真实代码,而不是记忆不清的伪代码,因为无法区分什么是真正的错误,什么是表示错误。这不是真实的代码:类定义必须以分号结尾,并且没有
ThreadManager::getRunningThread()
。请发布真实代码。
map<SignalID_t, std::queue<ucontext_t*>> ThreadManager::threadsWaitingOnConditions;
//                                       ^^^^^^^^^^^^^^^