尝试使用boost :: interprocess :: managed_shared_memory :: construct <t> </t>编译应用程序时出错

时间:2012-10-10 09:22:27

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

尝试使用construct<T>()类的boost::interprocess::managed_shared_memory方法时,我收到一个奇怪的编译错误。我在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对象在结构中定义然后创建时,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或功能的错误。

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

1 个答案:

答案 0 :(得分:1)

您没有展示演示错误的完整示例,因此我只能猜测,但我怀疑失败的行是在模板中,而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
}