Boost Multiindex: пример компилируется в файлах cpp, но не в заголовке

Я пытаюсь скомпилировать буст Multiindex пример

У меня есть проект, состоящий из нескольких заголовочных и исходных файлов.
Когда я помещаю следующий код в какой-то исходный файл, он работает хорошо, но он выдаст мне ошибки, приведенные ниже, когда я добавлю этот код в заголовочный файл. И header, и cpp включают в себя требуемые файлы заголовков boost, в противном случае boost работает нормально.

Я никогда не сталкивался с такой проблемой, и я совершенно сбит с толку, какова может быть причина.

// define a multiply indexed set with indices by id and name
typedef multi_index_container<
employee,
indexed_by<
// sort by employee::operator<
ordered_unique<identity<employee> >,

// sort by less<string> on name
ordered_non_unique<member<employee,std::string,&employee::name> >
>
> employee_set;

где сотрудник является простой структурой.

void print_out_by_name(const employee_set& es)
{
// get a view to index #1 (name)
const employee_set::nth_index<1>::type& name_index=es.get<1>();
// use name_index as a regular std::set
}

отсутствует имя типа перед именем зависимого типа employee_set :: nth_index
const employee_set :: nth_index<1> :: типа& name_index = es.get<1> ();

ожидаемый безусловный идентификатор
const employee_set :: nth_index<1> :: типа& name_index = es.get<1> ();

0

Решение

пытаться

const typename employee_set::nth_index<1>::type& name_index=es.get<1>();

nth_index<1> :: type — это то, что называется зависимым типом. Но компилятор не знает, является ли это типом значения или чем-то еще. И написание typename говорит ему, что это действительно тип.

1

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

С точки зрения компилятора C ++, неважно, находится ли код в .hpp или в .cpp file: заголовочные файлы (обычно) не компилируются сами по себе, а обрабатываются как часть .cpp файлы они #includeг в.

Итак, ваша проблема должна быть связана с некоторыми изменениями, которые вы непреднамеренно применяете при перемещении кода между «заголовочными» и «исходными» файлами. Как это выглядит,

void print_out_by_name(const employee_set& es);

не является функцией шаблона или частью шаблона класса и, следовательно, он не может иметь дело с зависимыми типами или чем-то, что может потребовать вставки typenames. Может быть, это часть большего класса, где employee_set это на самом деле параметр шаблона?

0

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