2010-12-15 4 views
3

그래서 multi_index_container으로 손대지 않으려 고 노력하고 있는데 이상한 컴파일러 오류가 발생했다. 가장 간단한 예가 여기에있다. 뭔가 바보 간단) ... g에 의해보고부스트 multi_index_container, 태그에 의한 색인 결과로 컴파일러 오류가 발생한다

#include <boost/multi_index_container.hpp> 
#include <boost/multi_index/sequenced_index.hpp> 
#include <boost/multi_index/ordered_index.hpp> 
#include <boost/multi_index/identity.hpp> 
#include <boost/multi_index/mem_fun.hpp> 

namespace multi_index = boost::multi_index; 

template <typename _IdType> 
class A 
{ 
public: 
    typedef _IdType IdType; 
    IdType getId() const { return id; } 

private: 
    IdType id; 
}; 

struct id_index{}; 

template <typename Traits> 
class Container 
{ 
    typedef typename Traits::AType AType; 
    typedef typename AType::IdType IdType; 

    typedef typename multi_index::multi_index_container< 
    AType, 
    multi_index::indexed_by< 
     // sort by Id 
     multi_index::ordered_non_unique<multi_index::tag<id_index>, BOOST_MULTI_INDEX_CONST_MEM_FUN(AType, IdType, getId) > 
    > 
    > ASet; 

    typedef typename ASet::template index<id_index>::type::const_iterator a_it; 
    typedef typename ASet::template index<id_index>::type::reverse_iterator a_rit; 

    typedef typename ASet::template index<id_index>::type id_index_t; 

public: 

    bool addA(AType const& cA) 
    { 
    const id_index_t& os = _cSet.get<id_index>(); // line 1: errors occur here 
    // .. do stuff 
    return true; 
    } 

private: 
    // Instance of the container... 
    ASet _cSet; 
}; 

struct ATraits 
{ 
    typedef A<int> AType; 
}; 

int main(void) 
{ 
    Container<ATraits> container; 

    ATraits::AType a; 

    container.addA(a); 

    return 0; 
} 

오류 ++ (GCC 4.4.4, 리눅스)입니다 : 나는 클래스 템플릿에 컨테이너를 개조까지

error: expected primary-expression before ‘>’ token (@ line 1) 
error: expected primary-expression before ‘)’ token (@ line 1) 

그래서이 잘 작동했다 ,이 후, 나는이 오류가 발생하고 왜 작동하지 않을 수 있습니다 ..

모든 아이디어를 ... 이해할 수있을 것이다

+0

bool addA(AType const& cA) { const id_index_t& os = _cSet.template get<id_index>(); // line 1: errors occur here // .. do stuff return true; } 
! – AraK

+0

@Arak, gcc odity라고 생각합니다. 그러나 @skwllsp의 해결책은 현재 잘 작동합니다! – Nim

답변

6
일어나고 있다는 것입니다,하지만 VC2010 코드의 벌금을 컴파일 왜 난 정말 아무 생각이
+0

ARRGH ... 나는 그것이 단순 할 수 있다고 생각했다! 이것은 템플릿/typename 지옥입니다 ... 저는 실제로 포기하고'get (_cSet)'을 사용했지만, 저는 이것을 다시 되돌릴 것입니다. 고마워! – Nim

+0

@ 님 :하지 마세요, 무료 기능은 갈 방법입니다 :) –

+0

@Metthieu, 정말요? 그러나 멤버 함수가 자유 함수가 수행 할 수없는 구현 세부 사항을 이용할 수 있습니까? – Nim

관련 문제