2010-01-29 137 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; 

,它只是由G ++甚至茜草:(

任何想法?

+0

您正在使用哪种版本的g ++?与VC++ 2005 BTW完美兼容的例子。 – 2010-01-29 14:39:17

+0

对于依赖名称,VC8相当宽松,您不必在标准要求您输入的'typename'和'template'前缀。 – 2010-01-29 14:41:16

+0

这是一个相当古老的gcc 4.1.2。 – ScaryAardvark 2010-01-29 16:39:52

回答

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

当成员模板名称 专业化后出现。或 - > 在一个后缀表达式,或之后 嵌套名称说明符在 合格-ID,和 后缀表达式或合格-ID 明确地依赖于 模板参数(14.6.2), 成员模板名称必须以关键字模板作为前缀 。否则, 名称被假定为命名为 非模板。

+0

谢谢。修复它..我可以问你是如何发现这一点或你使用什么参考。禁止在任何地方粘贴“模板”一词,我会_NEVER_发现这一点.... – ScaryAardvark 2010-01-29 14:43:25

+0

ScaryAardvark,我让gcc指向问题所在的实际行,并注意到您引用了_container模板成员函数,并且_container是模板参数类型。依赖模板必须以'template'作为前缀,与依赖类型的'typename'类似。 – 2010-01-29 14:50:09

+0

更正,我的意思是'_container'实际上是一个模板参数相关类型 - 如果这是正确的术语。 – 2010-01-29 15:28:11

0

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

+0

不,他们都在boost :: multi_index命名空间..我需要指定它们,因为我有一个与“身份”重复。 – ScaryAardvark 2010-01-29 14:42:06