错误C2248在stackoverflow上不是新的。不幸的是我是使用Boost库的初学者,我无法在我的代码中修复错误:
// .h file
using namespace boost::interprocess;
using namespace std;
class CMsqQueueMngr {
public:
// constructors & destructors
CMsqQueueMngr();
~CMsqQueueMngr();
int Open(char *queueName, int mode);
int Close();
int Read(uint8_t *data, int count);
int Write(uint8_t *data, int count, int priority);
boost::interprocess::message_queue mq;
private:
std::string mqName;
};
// .cpp file
CMsqQueueMngr::CMsqQueueMngr()
{} **<=== ERROR C2248**
CMsqQueueMngr::~CMsqQueueMngr()
{}
int CMsqQueueMngr::Open(char *queueName, int mode)
{
try{
//Erase previous message queue
message_queue::remove(queueName);
mqName.assign(queueName);
//Create a message_queue.
mq
(create_only //only create
, queueName //name
, 100 //max message number
, sizeof(int) //max message size
); **<=== ERROR C2064 **
//Send 100 numbers
for (uint8_t i = 0; i < 100; ++i){
mq.send(&i, sizeof(i), 0);
}
}
catch (interprocess_exception &ex){
std::cout << ex.what() << std::endl;
return -1;
}
return 0;
}
编译器错误:
错误C2248:'boost :: interprocess :: message_queue_t&gt; :: message_queue_t':无法访问class'boost :: interprocess :: message_queue_t&gt;
中声明的私有成员错误C2064:术语不评估为采用4个参数的函数
如何使变量 mq 可访问?
答案 0 :(得分:0)
您必须在包含类的构造函数中创建message queue对象mq
,
CMsqQueueMngr::CMsqQueueMngr():
mq(create_only, "my_first_queue_name", 100, sizeof(int))
{
}
并且您必须使用initalizer list来执行此操作,因为消息队列对象(例如mq
)有无法访问default constructor 。这是构造函数的右大括号后编译器消息C2248的含义。
Open
方法中发现的错误(因此是C2064)。其中还有一些其他错误(或误解或开放式结果),而对mq.send
的调用将按预期工作(至少一次)。
[更新]
或者,您可以使用堆栈上的变量访问boost的消息队列:
/// abbreviate name boost::interprocess::message_queue
using boost::interprocess::message_queue;
class CMsqQueueMngr {
public:
CMsqQueueMngr(const std::string& queue_name);
void WriteInt(int data);
// (some methods omitted)
private:
/// name of the queue
std::string mqName;
};
CMsqQueueMngr::CMsqQueueMngr(const std::string& name):
mqName(name)
{
}
void CMsqQueueMngr::WriteInt(const int data)
{
// create a queue for max 100 values at first call, open if existing
message_queue mq(open_or_create, mqName.c_str(), 100, sizeof (data));
mq.send(&data, sizeof(data), 0);
}
......我没试过这个,但如果不可能的话,the static remove
method没有多大意义。
答案 1 :(得分:0)
此处的错误意味着构造函数是私有的,因此无法调用。此外,由于您没有显式调用它,因此默认构造函数将作为CMsqQueueMngr的一部分进行调用。由于它(可能)是故意私有的,你需要调用适当的构造函数或类似的东西,但是你试图以不打算使用的方式使用该类。解决方案是研究说明。从那些,应该清楚该做什么,即通过初始化列表传递正确的参数:
CMsqQueueMngr::CMsqQueueMngr(char *queueName):
mq(create_only, queueName, 100, sizeof (int))
{}
注意:
explicit
。const
)char
的指针作为名称,请使用std::string
。queueName
。如果您不想这样,则必须动态分配队列。uint8_t
,所以为什么您的邮件大小配置为int
的大小?int mode
也是一个糟糕的选择,如果这就是它的意思,请使用枚举。