c++ - 再次出现错误 C2248

标签 c++ boost compiler-errors message-queue boost-interprocess

错误 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>::message_queue_t':无法访问在类'boost::interprocess::message_queue_t> 中声明的私有(private)成员

错误 C2064:术语不计算为采用 4 个参数的函数

如何使变量 MQ 无障碍?

最佳答案

您必须创建 message queue对象 mq在你包含类的构造函数中,

CMsqQueueMngr::CMsqQueueMngr(): 
    mq(create_only, "my_first_queue_name", 100, sizeof(int)) 
{
}

你必须使用 initalizer list , 因为有 无法访问 default constructor 用于消息队列对象(如 mq )。这是在构造函数的右大括号之后编译器消息 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没有多大意义。

关于c++ - 再次出现错误 C2248,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28276314/

相关文章:

c++ - 我的编译器有多聪明?

c++ - 由于 X509 重定义问题,编译 WebRTC 和 boost::uuid 时出现问题。我应该在哪里创建问题?

c++ - 我是否需要通过锁来保护对 Boost MultiIndex 索引(索引本身)的访问?

c++ - Boost::thread 的瞬时中断

mobile - 诺基亚:预验证类 java/langnoclassdeffounderror 时出错:java/lang/comparable for java me 平台

compiler-errors - Java中的范围检查编译困难

c++ - 为什么这个 EXC_BAD_ACCESS 发生在 long long 而不是 int 上?

c++ - 2D Box Collisions - 我做错了什么? (C++)

c++ - 以下情况的设计模式

java - 确定数字是否为 'insipid' 的方法