2012-09-23 203 views
1

時,我有struct Personmulti_index_containerMSVC++編譯器錯誤C2923通過模板參數

struct Person { 
    std::string firstName; 
    std::string lastName; 
    int id; 
    bool operator <(const Person& rhs) const {return id < rhs.id;} 
}; 

//index tags 
struct BaseIndexTag {}; 
struct FirstName : BaseIndexTag {}; 
struct LastName : BaseIndexTag {}; 
struct ID : BaseIndexTag {}; 

namespace bmi = boost::multi_index; 

typedef boost::multi_index_container< 
    Person, 
    bmi::indexed_by< 
    //PinsConnection operator < ordering 
    bmi::ordered_unique<bmi::tag<ID>, bmi::identity<Person> >, 
    //order by first name 
    bmi::ordered_non_unique<bmi::tag<FirstName>, bmi::member<Person, std::string, &Person::firstName> >, 
    //Order by last name 
    bmi::ordered_non_unique<bmi::tag<LastName>, bmi::member<Person, std::string, &Person::lastName> > 
    > 
> PersonMultiSet; 

和升壓轉換器的iterator_adaptor的包裝類:

template < 
typename I  //Internal iterator type 
, typename C //Container class 
> 
class IteratorAdaptor : public boost::iterator_adaptor < 
    IteratorAdaptor<I,C>,    //Derived 
    I,         //Base  
    boost::use_default,     //Value 
    boost::forward_traversal_tag>  //Traversal 
{ 
private: 
    friend class boost::iterator_core_access; 
    friend C; 
public: 
    IteratorAdaptor() 
     : typename IteratorAdaptor<I,C>::iterator_adaptor_() {} 
    explicit IteratorAdaptor(I& b) 
     : typename IteratorAdaptor<I,C>::iterator_adaptor_(b) {} 
}; 

最後,我寫了一個包裝類PersonMultiSet,爲了向這個類的用戶展示一個乾淨的界面,並避免提升的界面有些繁瑣:

class PersonContainer { 
public: 
    typedef IteratorAdaptor<PersonMultiSet::index<ID>::type::iterator, PersonContainer> IDIterator; 
    typedef IteratorAdaptor<PersonMultiSet::index<ID>::type::const_iterator, PersonContainer> IDConstIterator; 
    typedef IteratorAdaptor<PersonMultiSet::index<FirstName>::type::iterator, PersonContainer> FirstNameIterator; 
    typedef IteratorAdaptor<PersonMultiSet::index<FirstName>::type::const_iterator, PersonContainer> FirstNameConstIterator; 
    typedef IteratorAdaptor<PersonMultiSet::index<LastName>::type::iterator, PersonContainer> LastNameIterator; 
    typedef IteratorAdaptor<PersonMultiSet::index<LastName>::type::const_iterator, PersonContainer> LastNameConstIterator; 
    template <typename T> //tag 
    void foo(IteratorAdaptor<PersonMultiSet::index<T>::type::iterator, PersonContainer> &it) 
    { 
     //... 
    } 
private: 
    PersonMultiSet people; 
}; 

編譯VS2010下這個代碼產生以下錯誤在函數foo聲明:

1> main.cpp 
1>main.cpp(70): warning C4346: 'boost::multi_index::multi_index_container<Value,IndexSpecifierList>::index<T>::boost::multi_index::multi_index_container<Value1,IndexSpecifierList1,Allocator1>::index<Tag>::type::iterator' : dependent name is not a type 
1>   with 
1>   [ 
1>    Value=Person, 
1>    IndexSpecifierList=boost::multi_index::indexed_by<boost::multi_index::ordered_unique<boost::multi_index::tag<ID>,boost::multi_index::identity<Person>>,boost::multi_index::ordered_non_unique<boost::multi_index::tag<FirstName>,boost::multi_index::member<Person,std::string,pointer-to-member(0x0)>>,boost::multi_index::ordered_non_unique<boost::multi_index::tag<LastName>,boost::multi_index::member<Person,std::string,pointer-to-member(0x20)>>> 
1>   ] 
1>   prefix with 'typename' to indicate a type 
1>main.cpp(70): error C2923: 'IteratorAdaptor' : 'boost::multi_index::multi_index_container<Value,IndexSpecifierList>::index<T>::boost::multi_index::multi_index_container<Value1,IndexSpecifierList1,Allocator1>::index<Tag>::type::iterator' is not a valid template type argument for parameter 'I' 
1>   with 
1>   [ 
1>    Value=Person, 
1>    IndexSpecifierList=boost::multi_index::indexed_by<boost::multi_index::ordered_unique<boost::multi_index::tag<ID>,boost::multi_index::identity<Person>>,boost::multi_index::ordered_non_unique<boost::multi_index::tag<FirstName>,boost::multi_index::member<Person,std::string,pointer-to-member(0x0)>>,boost::multi_index::ordered_non_unique<boost::multi_index::tag<LastName>,boost::multi_index::member<Person,std::string,pointer-to-member(0x20)>>> 
1>   ] 
1> 
1>Build FAILED. 

看來,編譯器不允許類型IteratorAdaptor<PersonMultiSet::index<T>::type::iterator不要在第一次使用來確定(我得到這個錯誤之前我甚至嘗試實例化PersonContainer或調用foo)。 我在做什麼錯?

+2

'前綴 '類型名稱' 來表示type'。 –

+0

@Kiril:我試過了,但在哪裏?我試着用T前綴的每一個... – eladidan

回答

3

編譯器給你一個暗示了什麼問題:

與「類型名稱」

前綴指示型

所以,你需要「有問題」的參數之前添加typename

void foo(IteratorAdaptor<PersonMultiSet::index<T>::type::iterator, 
         PersonContainer> &it) 

必須是:

//       vvvvvvvv 
void foo(IteratorAdaptor< typename PersonMultiSet::index<T>::type::iterator, 
          PersonContainer> &it) 
+0

我會把它放在這裏'IteratorAdaptor :: type :: iterator,PersonContainer>'因爲這是依賴類型。 –

+0

大佬們,我錯過了一個支架''。謝謝,哦! –

+0

d'oh!感謝Kiril。我實際上嘗試添加typename,但錯誤的參數 – eladidan