2

尝试使用类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 的错误还是功能。

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

4

1 回答 1

1

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

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

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

有关更多信息,请参阅C++ 模板常见问题解答

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

#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
}
于 2012-10-12T11:40:24.077 回答