Ошибка при попытке скомпилировать приложение с использованием boost :: interprocess :: managed_shared_memory :: construct & lt; T & gt;

Я получаю странную ошибку компиляции при попытке использовать construct<T>() метод boost::interprocess::managed_shared_memory учебный класс. Я использую библиотеку Boost в версии 1.48 и GCC в версии 4.6.3.

Проблема в том, что когда я создаю 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 или функцией.

Кто-нибудь боролся с подобной ошибкой или знает в чем может быть причина?

2

Решение

Вы не показали полный пример, который демонстрирует ошибку, поэтому я могу только догадываться, но я подозреваю, что строка, которая терпит неудачу, находится внутри шаблона и handler это зависимый тип.

Чтобы это исправить, нужно сообщить компилятору, что construct это шаблон функции:

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

Увидеть FAQ по шаблонам 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
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]