странная проблема с пространством имен шаблонов - PullRequest
1 голос
/ 29 января 2010

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

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

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 ++ еще более безумным :(

Есть идеи?

Ответы [ 2 ]

6 голосов
/ 29 января 2010

Префикс 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 голосов
/ 29 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...