尝试使用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或功能的错误。
有没有人在遇到类似的错误或者知道原因是什么?
答案 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
}