Я получаю странную ошибку компиляции при попытке использовать 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 или функцией.
Кто-нибудь боролся с подобной ошибкой или знает в чем может быть причина?
Вы не показали полный пример, который демонстрирует ошибку, поэтому я могу только догадываться, но я подозреваю, что строка, которая терпит неудачу, находится внутри шаблона и 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
}
Других решений пока нет …