我在尝试使用 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/