У меня странная проблема с шаблонами и пространствами имен ...странный шаблон имен проблема
У меня есть следующий код, который отлично компилируется ..
using namespace boost::multi_index;
template < typename OT, typename KT, KT (OT::* KM)() const, typename KC, typename CMP >
class OrderBook
{
public:
OrderBook() {}
~OrderBook() {}
typedef multi_index_container<
OT,
indexed_by<
ordered_unique<
const_mem_fun< OT, KT, KM >,
KC
>,
ordered_unique<
identity<OT>,
CMP
>
>
> Container;
typedef typename Container::template nth_index<0>::type index_0;
typedef typename Container::template nth_index<1>::type index_1;
typedef typename index_0::const_iterator const_iterator_0;
typedef typename index_1::const_iterator const_iterator_1;
const_iterator_0 begin0() const { return _container.get<0>().begin(); }
const_iterator_0 end0() const { return _container.get<0>().end(); }
public:
Container _container;
};
Однако из-за столкновения пространства имен когда это вставить этот код в другой проект, я должен иметь ... (Обратите внимание на то, как я должен был удалить с помощью namespace boost::multi_index
и вручную указать его при необходимости
template < typename OT, typename KT, KT (OT::* KM)() const, typename KC, typename CMP >
class OrderBook
{
public:
OrderBook() {}
~OrderBook() {}
typedef boost::multi_index::multi_index_container<
OT,
boost::multi_index::indexed_by<
boost::multi_index::ordered_unique<
boost::multi_index::const_mem_fun< OT, KT, KM >,
KC
>,
boost::multi_index::ordered_unique<
boost::multi_index::identity<OT>,
CMP
>
>
> Container;
typedef typename Container::template nth_index<0>::type index_0;
typedef typename Container::template nth_index<1>::type index_1;
typedef typename index_0::const_iterator const_iterator_0;
typedef typename index_1::const_iterator const_iterator_1;
const_iterator_0 begin0() const { return _container.get<0>().begin(); }
const_iterator_0 end0() const { return _container.get<0>().end(); }
public:
Container _container;
};
Что дает мне т он следит за ошибкой из g ++.
In member function 'typename boost::multi_index::multi_index_container<OT, boost::multi_index::indexed_by<boost::multi_index::ordered_unique<boost::multi_index::const_mem_fun<OT, KT, KM>, KC, mpl_::na>, boost::multi_index::ordered_unique<boost::multi_index::identity<Value>, CMP, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::allocator<_CharT> >::nth_index<0>::type::const_iterator OrderBook<OT, KT, KM, KC, CMP>::begin0() const':
error: expected primary-expression before ')' token
In member function 'typename boost::multi_index::multi_index_container<OT, boost::multi_index::indexed_by<boost::multi_index::ordered_unique<boost::multi_index::const_mem_fun<OT, KT, KM>, KC, mpl_::na>, boost::multi_index::ordered_unique<boost::multi_index::identity<Value>, CMP, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::allocator<_CharT> >::nth_index<0>::type::const_iterator OrderBook<OT, KT, KM, KC, CMP>::end0() const':
error: expected primary-expression before ')' token
К сожалению для длинных сообщений об ошибках, я рассмотреть очистки их, но я подумал, что лучше оставить их нетронутыми в случае я извлекал то важное.
Я попытался это ...
typedef typename Container::template boost::multi_index::nth_index<0>::type index_0;
typedef typename Container::template boost::multi_index::nth_index<1>::type index_1;
и он просто сделал г ++ даже безумнее :(
Любые идеи?
Какую версию g ++ вы используете? Пример отлично компилируется с VC++ 2005 BTW. –
VC8 довольно слабоват относительно зависимых имен, вам не всегда нужно префикс с 'typename' и' template', где вам потребуется стандарт. –
Это довольно старый gcc 4.1.2. – ScaryAardvark