c++ - 尝试使用 boost::interprocess::managed_shared_memory::construct<T> 编译应用程序时出错

标签 c++ boost g++ shared-memory boost-interprocess

我在尝试使用 construct<T>() 时收到一个奇怪的编译错误boost::interprocess::managed_shared_memory 的方法类(class)。我在 1.48 版本中使用 Boost 库,在 4.6.3 版本中使用 GCC。

问题是当我创建一个 managed_shared_memory object (它不是结构的成员)然后我试图通过使用它来构造任何对象 construct<T>()方法,编译成功:

#include <boost/interprocess/managed_shared_memory.hpp>
namespace proc = boost::interprocess;

template <typename _T>
void TFunc() {
    proc::managed_shared_memory mem;
    mem = proc::managed_shared_memory(proc::create_only, "mem1", 1024);
    int* ob1 = mem.construct<int>("i1") ();
}

虽然,当 managed_shared_memory object在一个struct里面定义然后创建,编译用法construct<T>()方法失败:

#include <boost/interprocess/managed_shared_memory.hpp>
namespace proc = boost::interprocess;

template <typename _T>
void TFunc() { 
    struct MemoryHandler {
        proc::managed_shared_memory mem;
    } handler;

    handler.mem = proc::managed_shared_memory(proc::create_only, "mem2", 1024);
    int* ob2 = handler.mem.construct<int>("i2") ();  // failure
}

出现以下 GCC 错误,指向带有 construct 的行使用方法:

error: expected primary-expression before 'int'
error: expected ',' or ';' before 'int'

不幸的是,我没有针对其他版本的 Boost 和 GCC 对其进行测试,所以我不知道这是 Boost/GCC 的错误还是特性。

有没有人遇到过类似的错误或者知道可能是什么原因?

最佳答案

你没有展示一个完整的例子来证明错误,所以我只能猜测,但我怀疑失败的行在模板内并且 handler 是一个依赖类型。

要修复它,您需要告诉编译器 construct 是一个函数模板:

int* ob2 = handler.mem.template construct<int>("i2") ();
                       ^^^^^^^^

参见 C++ Templates FAQ获取更多信息。

下次请发布一个完整的示例,以便其他人可以重现确切的问题,而不是让人们猜测。例如,这是一个显示相同错误的最小的完整示例:

#include <boost/interprocess/managed_shared_memory.hpp>

namespace proc = boost::interprocess;

struct MemoryHandler{
        proc::managed_shared_memory mem;
} handler;

template<typename T> void f(T handler)
{
  handler.mem = proc::managed_shared_memory(proc::create_only, "mem2", 10);
  int* ob2 = handler.mem.construct<int>("i2") ();  // failure
}

关于c++ - 尝试使用 boost::interprocess::managed_shared_memory::construct<T> 编译应用程序时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12816013/

相关文章:

c++ - 用于 C++ 的进程安全日志库

c++ - 如何消除动态销毁 boost::asio 实体时的崩溃?

c++ - Boost.Asio 链接错误

c++ - 如何解析函数及其参数

c++ - 与模板类的链接错误

c++ - 类内定义的友元函数是否自动内联?

c++ - 如何启动具有 root 权限的 QProcess?

C++ - 函数在尝试忽略同一行时读取它两次

c++ - c++ 目标文件应该只通过 g++ 链接吗?

c++ - 未检测为未使用的变量