c++循环使用queue- error: ' begin '没有在此范围内声明



我对c++指针和地址不是很熟悉。我想我有一个与指针有关的错误。程序由不同的对象的对象组成,我将在下面描述相关的部分。

我有一个"JobManager"类管理的多个用户,用户存储在队列中。每个用户有两个"JobQueue"类型的队列,并且有一个过程返回一个"Mqueue"类型的对象,这个过程通过访问对象(JobQueue seqjobs;)获得Mqueue对象。JobQueue类包含两个<Job*>还有其他程序。Job类是描述每个作业的普通类。Job、JobManager、User、JobQueue和Mqueue类中的相关部分如下所示。

Job类:

class Job {
public:
std::string accname, peer;
int ra = 0; 
paramlist params;
JobState state = WAITING;
std::chrono::system_clock::time_point jobarrivingtime;
bool error = false;
int jobno = -1;
Job(AccJob accjob, std::string peer) {
jobarrivingtime = (high_resolution_clock::now());
accname = accjob.accname();
this->peer = peer;
this->ra =accjob.ra();
for (auto &param : accjob.parameters())
params[param.first] = param.second;
}
Job() {}
};

JobManager类:

class JobManager {
public:
std::deque<User*> users;
void addJob(Job* job) {
for (User *user : users) {
if (user->peername == job->peer) {
if(job->ra == 1 || job->ra == 2)
user->ranjobs.pushJob(job);
else if (job->ra == 3 || job->ra == 4) 
user->seqjobs.pushJob(job);
return;
}
}
User *user = new User();
user->peername = job->peer;
if(job->ra == 1 || job->ra == 2)
user->ranjobs.pushJob(job);
else if (job->ra == 3 || job->ra == 4)
user->seqjobs.pushJob(job);
users.push_back(user);
}
.
.
.
.
};

在User类中:

class User {
public:
JobQueue seqjobs;  
JobQueue ranjobs;  

std::string peername;
MQueue<Job*>* getSeqMemJobs(){
return &(seqjobs.memjobs);
}
};

JobQueue类:

class JobQueue {
public:
MQueue<Job*> comjobs;  
MQueue<Job*> memjobs; 
bool isEmpty() {
return (memjobs.empty() && comjobs.empty());
}
Job* peekComJob() {
Job* j = comjobs.peek();
return j;
}

.
.
.
.
.
};
MQueue类:
#include <mutex>
#include <queue>
template <class T>
class MQueue {
public:
MQueue(){
}
void push(T a) {
std::lock_guard<std::mutex> lock(mutex);
data.push(a);
}
bool empty() {
return data.empty();
}
T peek() {
std::lock_guard<std::mutex> lock(mutex);
return data.front();
}
T pop() {
std::lock_guard<std::mutex> lock(mutex);
T ret = data.front();
data.pop();
return ret;
}
private:
std::queue<T> data;
std::mutex mutex;
};

有什么问题吗?

当我尝试访问每个用户中的一些作业时,我有一个错误。为了简化问题,我试图通过使用"user->getSeqMemJobs()"来访问每个用户的一个Mqueue。我有两个循环;一个用于访问所有用户,一个用于访问seqjobs JobQueue中的memJobs Mqueue中的每个用户作业。第一个循环运行正常,但第二个循环出现错误。

main(第二个循环中的错误):

for (User *user : jobmanager.users) {
std::cout << " - " << user->peername << std::endl;
for (Job *job : user->getSeqMemJobs())
std::cout << "   - " << job->accname << std::endl;
}

错误:

daemon/cserv.cpp:533:47: error: ‘begin’ was not declared in this scope
for (Job *job : user->getSeqMemJobs())
^
daemon/cserv.cpp:533:47: note: suggested alternatives:
In file included from /usr/include/c++/7/string:51:0,
from /usr/include/c++/7/bits/locale_classes.h:40,
from /usr/include/c++/7/bits/ios_base.h:41,
from /usr/include/c++/7/ios:42,
from /usr/include/c++/7/ostream:38,
from /usr/include/c++/7/iostream:39,
from daemon/cserv.cpp:2:
/usr/include/c++/7/bits/range_access.h:105:37: note:   ‘std::begin’
template<typename _Tp> const _Tp* begin(const valarray<_Tp>&);
^~~~~
/usr/include/c++/7/bits/range_access.h:105:37: note:   ‘std::begin’
/usr/include/c++/7/bits/range_access.h:105:37: note:   ‘std::begin’
daemon/cserv.cpp:533:47: error: ‘end’ was not declared in this scope
for (Job *job : user->getSeqMemJobs())
^
daemon/cserv.cpp:533:47: note: suggested alternatives:
In file included from /usr/include/c++/7/string:51:0,
from /usr/include/c++/7/bits/locale_classes.h:40,
from /usr/include/c++/7/bits/ios_base.h:41,
from /usr/include/c++/7/ios:42,
from /usr/include/c++/7/ostream:38,
from /usr/include/c++/7/iostream:39,
from daemon/cserv.cpp:2:
/usr/include/c++/7/bits/range_access.h:107:37: note:   ‘std::end’
template<typename _Tp> const _Tp* end(const valarray<_Tp>&);
^~~
/usr/include/c++/7/bits/range_access.h:107:37: note:   ‘std::end’
/usr/include/c++/7/bits/range_access.h:107:37: note:   ‘std::end’

我知道循环不能访问指针,但我在这里能做什么?我想迭代器已经在queue"中实现了。

我添加了开始和结束到MQueue类(如下所示),但它不工作,也许我做了一个错误的方式。

T begin(){ 
return data.front(); 
} 
T end(){
return data.back();
}

同时,我将for循环修改为:(我认为它更有前途)

for (User *user : jobmanager.users) {
std::cout << " - " << user->peername << std::endl;
for (Job *job :std::begin(user->getSeqMemJobs())){
std::cout << "   - " << job->accname << std::endl;
if (job == std::end(user->getSeqMemJobs()))
break;
}
}

然后我得到了这个错误:

daemon/cserv.cpp: In member function ‘void DaemonImpl::executor()’:
daemon/cserv.cpp:533:58: error: no matching function for call to ‘begin(MQueue<Job*>*)’
for (Job *job :std::begin(user->getSeqMemJobs())){
^
In file included from /usr/include/c++/7/bits/range_access.h:36:0,
from /usr/include/c++/7/string:51,
from /usr/include/c++/7/bits/locale_classes.h:40,
from /usr/include/c++/7/bits/ios_base.h:41,
from /usr/include/c++/7/ios:42,
from /usr/include/c++/7/ostream:38,
from /usr/include/c++/7/iostream:39,
from daemon/cserv.cpp:2:
/usr/include/c++/7/initializer_list:89:5: note: candidate: template<class _Tp> constexpr const _Tp* std::begin(std::initializer_list<_Tp>)
begin(initializer_list<_Tp> __ils) noexcept
^~~~~
/usr/include/c++/7/initializer_list:89:5: note:   template argument deduction/substitution failed:
daemon/cserv.cpp:533:58: note:   mismatched types ‘std::initializer_list<_Tp>’ and ‘MQueue<Job*>*’
for (Job *job :std::begin(user->getSeqMemJobs())){
^
In file included from /usr/include/c++/7/string:51:0,
from /usr/include/c++/7/bits/locale_classes.h:40,
from /usr/include/c++/7/bits/ios_base.h:41,
from /usr/include/c++/7/ios:42,
from /usr/include/c++/7/ostream:38,
from /usr/include/c++/7/iostream:39,
from daemon/cserv.cpp:2:
/usr/include/c++/7/bits/range_access.h:48:5: note: candidate: template<class _Container> constexpr decltype (__cont.begin()) std::begin(_Container&)
begin(_Container& __cont) -> decltype(__cont.begin())
^~~~~
/usr/include/c++/7/bits/range_access.h:48:5: note:   template argument deduction/substitution failed:
/usr/include/c++/7/bits/range_access.h: In substitution of ‘template<class _Container> constexpr decltype (__cont.begin()) std::begin(_Container&) [with _Container = MQueue<Job*>*]’:
daemon/cserv.cpp:533:58:   required from here
/usr/include/c++/7/bits/range_access.h:48:50: error: request for member ‘begin’ in ‘__cont’, which is of pointer type ‘MQueue<Job*>*’ (maybe you meant to use ‘->’ ?)
begin(_Container& __cont) -> decltype(__cont.begin())
~~~~~~~^~~~~
/usr/include/c++/7/bits/range_access.h:58:5: note: candidate: template<class _Container> constexpr decltype (__cont.begin()) std::begin(const _Container&)
begin(const _Container& __cont) -> decltype(__cont.begin())
^~~~~
/usr/include/c++/7/bits/range_access.h:58:5: note:   template argument deduction/substitution failed:
/usr/include/c++/7/bits/range_access.h: In substitution of ‘template<class _Container> constexpr decltype (__cont.begin()) std::begin(const _Container&) [with _Container = MQueue<Job*>*]’:
daemon/cserv.cpp:533:58:   required from here
/usr/include/c++/7/bits/range_access.h:58:56: error: request for member ‘begin’ in ‘__cont’, which is of pointer type ‘MQueue<Job*>* const’ (maybe you meant to use ‘->’ ?)
begin(const _Container& __cont) -> decltype(__cont.begin())
~~~~~~~^~~~~
/usr/include/c++/7/bits/range_access.h:87:5: note: candidate: template<class _Tp, long unsigned int _Nm> constexpr _Tp* std::begin(_Tp (&)[_Nm])
begin(_Tp (&__arr)[_Nm])
^~~~~
/usr/include/c++/7/bits/range_access.h:87:5: note:   template argument deduction/substitution failed:
daemon/cserv.cpp:533:58: note:   mismatched types ‘_Tp [_Nm]’ and ‘MQueue<Job*>*’
for (Job *job :std::begin(user->getSeqMemJobs())){
^

感谢

通过在MQueue中添加迭代器指针来解决:

T begin(){
return data.front();
}
T end(){
return data.back();
}
T next(){
ptr = ptr + (sizeof(T));
return *ptr;
}
void resetPtr(){
ptr = &data.front();
}

按如下方式修改main中的循环:

for (User *user : jobmanager.users) {
std::cout << " - " << user->peername << std::endl;
Job* job;
job = user->getSeqMemJobs()->begin();
while(job != NULL){
std::cout << "   - " << job->accname << std::endl;
if (job == user->getSeqMemJobs()->end())
break;
job = user->getSeqMemJobs()->next();
}
user->getSeqMemJobs()->resetPtr();
}

最新更新