Использование boost multi_index внутри шаблонной структуры
Я получаю error: expected unqualified-id before 'typename'
в строке 59, когда я пытаюсь скомпилировать это:
#include <cstdlib>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/identity.hpp>
#include <boost/multi_index/member.hpp>
template <typename ValueT, typename SizeT = size_t>
struct Test {
typedef SizeT SizeType;
typedef ValueT ValueType;
struct ValueTag {};
struct ProbabilityTag {};
struct TotalProbabilityTag {};
struct NodeType {
SizeType value;
ValueType probability;
ValueType totalProbability;
typedef boost::multi_index_container<
NodeType,
boost::multi_index::indexed_by<
boost::multi_index::ordered_unique<
boost::multi_index::tag<ValueTag>,
BOOST_MULTI_INDEX_MEMBER(NodeType, SizeType, value)
>,
boost::multi_index::ordered_non_unique<
boost::multi_index::tag<ProbabilityTag>,
BOOST_MULTI_INDEX_MEMBER(NodeType, ValueType, probability)
>,
boost::multi_index::ordered_non_unique<
boost::multi_index::tag<TotalProbabilityTag>,
BOOST_MULTI_INDEX_MEMBER(NodeType, ValueType, totalProbability)
>
>
> NodeIndexType;
NodeIndexType * node;
NodeType(const NodeType & o):
value(o.value),
probability(o.probability),
totalProbability(o.totalProbability)
{
if (o.node != NULL) {
this->node = new NodeIndexType(*(o.node));
}
}
~NodeType() {
delete this->node;
}
bool operator< (const NodeType & b) const {
return this->value < b.value;
}
};
typedef typename NodeType::NodeIndexType NodeIndexType;
typedef NodeIndexType::typename index<typename ValueTag>::type ViewNodeByValue; /* this does not work */
};
int main() {
Test<int> a;
return EXIT_SUCCESS;
}
Все работает нормально, если я удалю закомментированную строку. Я уже видел параметр шаблона для увеличения многоиндексного контейнера, но я не могу найти способ заставить это работать внутри шаблонной структуры или класса.
Кто-нибудь, кто может сказать мне, как это исправить?
См. http://codepad.org/UPMapaXI для сообщения об ошибке.
1 ответ
Выполнение еще нескольких тестов и повторное рассмотрение соответствующего вопроса сделало очевидным, что правильный способ сделать это
typedef typename NodeIndexType::template index<ValueTag>::type NodeByValue;
как уже объяснено в параметре шаблона, чтобы увеличить многоиндексный контейнер. Важным моментом было отметить индекс как шаблон.
Альтернативой является использование
typedef typename boost::multi_index::index<NodeIndexType, ValueTag>::type ViewNodeByValue;
который я нашел в мульти индексном контейнере Boost зависимой от шаблона структуры в шаблонном классе.