怪模板名称空间问题

时间:2010-01-29 14:28:49

标签: c++ templates namespaces

模板和名称空间有一个奇怪的问题......

我有以下编译好的代码..

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 个答案:

答案 0 :(得分: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

  

当成员模板的名称时   专业化之后出现。或 - &gt;   在后缀表达式中,或之后   a中的嵌套名称说明符   qual-id和   postfix-expression或qualified-id   明确取决于a   template-parameter(14.6.2),.   成员模板名称必须加前缀   通过关键字模板。否则   假定名称命名为   非模板。

答案 1 :(得分:0)

也许我可以猜测其中某些功能不在boost::multi_index命名空间中:indexed_bordered_uniqueconst_mem_funidentity