Я пытаюсь скомпилировать буст 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> ();
пытаться
const typename employee_set::nth_index<1>::type& name_index=es.get<1>();
nth_index<1> :: type — это то, что называется зависимым типом. Но компилятор не знает, является ли это типом значения или чем-то еще. И написание typename говорит ему, что это действительно тип.
С точки зрения компилятора C ++, неважно, находится ли код в .hpp
или в .cpp
file: заголовочные файлы (обычно) не компилируются сами по себе, а обрабатываются как часть .cpp
файлы они #include
г в.
Итак, ваша проблема должна быть связана с некоторыми изменениями, которые вы непреднамеренно применяете при перемещении кода между «заголовочными» и «исходными» файлами. Как это выглядит,
void print_out_by_name(const employee_set& es);
не является функцией шаблона или частью шаблона класса и, следовательно, он не может иметь дело с зависимыми типами или чем-то, что может потребовать вставки typename
s. Может быть, это часть большего класса, где employee_set
это на самом деле параметр шаблона?