2010-01-29 2 views
1

У меня странная проблема с шаблонами и пространствами имен ...странный шаблон имен проблема

У меня есть следующий код, который отлично компилируется ..

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; 

и он просто сделал г ++ даже безумнее :(

Любые идеи?

+0

Какую версию g ++ вы используете? Пример отлично компилируется с VC++ 2005 BTW. –

+0

VC8 довольно слабоват относительно зависимых имен, вам не всегда нужно префикс с 'typename' и' template', где вам потребуется стандарт. –

+0

Это довольно старый gcc 4.1.2. – ScaryAardvark

ответ

6

Префикс get<0>() с template:

const_iterator_0 begin0() const { return _container.template get<0>().begin(); } 
const_iterator_0 end0 () const { return _container.template get<0>().end(); } 

typename Аналогично для зависимых типов, зависимые шаблоны должны предваряться template:

struct X { 
    template<class T> void f(); 
}; 

template<class T> 
void test() { 
    T::f<int>(); // ill-formed 
    T::template f<int>(); // ok 
} 

// ... 
test<X>(); 

А для любопытных, то есть §14.2/4:

Когда имя элемента шаблона специализация появляется после. или -> в постфиксе-выражении, или после того, как вложенного имя спецификатора в уточненного идентификатора, и постфикс-выражение или квалифицированный идентификатор явно зависит от -шаблон параметра (14.6.2), имя шаблона члена должно быть префикс по шаблону ключевого слова. В противном случае предполагается, что имя обозначает не шаблон шаблона .

+0

Спасибо. Это исправило это. Могу ли я спросить, как вы это узнали или какую ссылку вы использовали. Запрет наклеивать слово «шаблон» повсюду, я бы нашел _NEVER_ ... – ScaryAardvark

+0

ScaryAardvark, я хочу, чтобы gcc указывал мне на фактическую строку, где возникла проблема, и заметил, что вы ссылаетесь на функцию-член шаблона '_container' и что' _container' имеет тип аргумента шаблона. Зависимые шаблоны должны иметь префикс 'template', аналогичный' typename' для зависимых типов. –

+0

Коррекция, я имею в виду '_container' - фактически зависимый от шаблона тип аргумента - если это правильный термин. –

0

Может быть, я могу предположить, что некоторые из этих функций не в boost::multi_index пространство имен: indexed_b, ordered_unique, const_mem_fun или identity

+0

Нет, все они находятся в пространстве имен boost: multi_index. Мне нужно было указать их точно, потому что у меня был дубликат с «личностью». – ScaryAardvark

Смежные вопросы