У меня есть следующие определения:
typedef boost::multi_index_container<
ModelPtr,
boost::multi_index::indexed_by<
boost::multi_index::sequenced<boost::multi_index::tag<byInsertOrder> >, // to keep order of inserting
boost::multi_index::ordered_non_unique< boost::multi_index::tag<byPriority>,
boost::multi_index::const_mem_fun<IModel,
unsigned int,
&IModel::getPriority>,
std::greater< unsigned int> // from the highest priority to the lowest
>
>
> ModelContainer;
typedef ModelContainer::template index<AOActivationList::byInsertOrder>::type ModelByInsertOrderType; (*)
Проблема в том, что когда я пытаюсь скомпилировать его с помощью gcc 4.5.3, я получаю следующую ошибку:
ошибка: «шаблон» (как устранение неоднозначности) допускается только в шаблонах
В строке отмечен (*). В Visual Studio 2008 это компилируется.
В чем причина этого? Как это исправить?
На этой линии:
typedef ModelContainer::template index<AOActivationList::byInsertOrder>::type ModelByInsertOrderType
убери слово template
, если вы не в пределах template
, как используя ModelContainer::template ...
действует только если ModelContainer
тип зависит от нефиксированного template
параметры в текущей области.
Если бы компилятор мог выяснить полный тип ModelContainer
на этой линии, использование template
не допускается. Если он не может понять это наверняка, то использование template
необходимо.
Решение Visual Studio компилировать или не компилировать данный фрагмент кода редко является хорошим доказательством того, что код является допустимым C ++ по какому-либо стандарту.
Других решений пока нет …