2010-03-17 2 views
1

Я пытаюсь использовать элементы метапрограммирования, но попал в стену с первым испытанием. Я хотел бы иметь структуру, компаратор, который можно использовать следующим образом:Шаблон с постоянным выражением: ошибка C2975 с VC++ 2008

intersect_by<ID>(L1.data, L2.data, "By ID: "); 
intersect_by<IDf>(L1.data, L2.data, "By IDf: "); 

Где:

struct ID{};// Tag used for original IDs 
    struct IDf{};// Tag used for the file position 
    //following Boost.MultiIndex examples 
    template<typename Tag,typename MultiIndexContainer> 
    void intersect_by(
    const MultiIndexContainer& L1,const MultiIndexContainer& L2,std::string msg, 
     Tag* =0 /* fixes a MSVC++ 6.0 bug with implicit template function parms */ 
    ) 
    { 
    /* obtain a reference to the index tagged by Tag */ 

    const typename boost::multi_index::index<MultiIndexContainer,Tag>::type& L1_ID_index= 
    get<Tag>(L1); 
    const typename boost::multi_index::index<MultiIndexContainer,Tag>::type& L2_ID_index= 
    get<Tag>(L2); 

     std::set_intersection(
     L1_ID_index.begin(), 
     L1_ID_index.end(), 
     L2_ID_index.begin(), 
     L2_ID_index.end(), 
     std::inserter(s, s.begin()), strComparator<Tag>() // Here I get the C2975 error 
    ); 
     } 

    template<int N> struct strComparator; 
    template<> 
    struct strComparator<0>{ 
    bool operator() (const particleID& id1, const particleID& id2) const 
    { 
    return id1.ID<id2.ID; 
    } 
    }; 
    template<> 
    struct strComparator<1>{ 
    bool operator() (const particleID& id1, const particleID& id2) const 
    { 
    return id1.IDf<id2.IDf; 
    } 

    }; 

Что мне не хватает?

вид привет Arman.

Извините, я не скопировал полное сообщение об ошибке. Полная ошибка:

>Compiling... 
1>trace_ids.cpp 
1>c:\documents and settings\arm2arm\mes documents\visual studio 2008\projects\mstgraph\trace_ids\trace_ids.cpp(133) : error C2975: 'strComparator' : invalid template argument for 'N', expected compile-time constant expression 
1>  c:\documents and settings\arm2arm\mes documents\visual studio 2008\projects\mstgraph\trace_ids\trace_ids.cpp(47) : see declaration of 'strComparator' 
1>  c:\documents and settings\arm2arm\mes documents\visual studio 2008\projects\mstgraph\trace_ids\trace_ids.cpp(144) : see reference to function template instantiation 'void intersect_by<ID,particlesID_set>(const MultiIndexContainer &,const MultiIndexContainer &,std::string,Tag *)' being compiled 
1>  with 
1>  [ 
1>   MultiIndexContainer=particlesID_set, 
1>   Tag=ID 
1>  ] 
1>c:\documents and settings\arm2arm\mes documents\visual studio 2008\projects\mstgraph\trace_ids\trace_ids.cpp(133) : error C2955: 'strComparator' : use of class template requires template argument list 
1>  c:\documents and settings\arm2arm\mes documents\visual studio 2008\projects\mstgraph\trace_ids\trace_ids.cpp(47) : see declaration of 'strComparator' 
1>c:\documents and settings\arm2arm\mes documents\visual studio 2008\projects\mstgraph\trace_ids\trace_ids.cpp(134) : error C2784: '_OutElem *std::set_intersection(_InIt1,_InIt1,_InIt2,_InIt2,_OutElem (&)[_Size],_Pr)' : could not deduce template argument for '_OutElem (&)[_Size]' from 'std::insert_iterator<_Container>' 
1>  with 
1>  [ 
1>   _Container=particlesID_set 
1>  ] 
1>  c:\program files\microsoft visual studio 9.0\vc\include\algorithm(4064) : see declaration of 'std::set_intersection' 
1>c:\documents and settings\arm2arm\mes documents\visual studio 2008\projects\mstgraph\trace_ids\trace_ids.cpp(134) : error C2780: '::std::_Enable_if<!std::_Is_checked_iterator<_OutIt>::_Result,_OutIt>::_Result std::set_intersection(_InIt1,_InIt1,_InIt2,_InIt2,_OutIt)' : expects 5 arguments - 6 provided 
1>  c:\program files\microsoft visual studio 9.0\vc\include\algorithm(4004) : see declaration of 'std::set_intersection' 
1>c:\documents and settings\arm2arm\mes documents\visual studio 2008\projects\mstgraph\trace_ids\trace_ids.cpp(134) : error C2780: '_OutElem *std::set_intersection(_InIt1,_InIt1,_InIt2,_InIt2,_OutElem (&)[_Size])' : expects 5 arguments - 6 provided 
1>  c:\program files\microsoft visual studio 9.0\vc\include\algorithm(3993) : see declaration of 'std::set_intersection' 
1>c:\documents and settings\arm2arm\mes documents\visual studio 2008\projects\mstgraph\trace_ids\trace_ids.cpp(134) : error C2780: '::std::_Enable_if<std::_Is_checked_iterator<_OutIt>::_Result,_OutIt>::_Result std::set_intersection(_InIt1,_InIt1,_InIt2,_InIt2,_OutIt)' : expects 5 arguments - 6 provided 
1>  c:\program files\microsoft visual studio 9.0\vc\include\algorithm(3983) : see declaration of 'std::set_intersection' 
1>c:\documents and settings\arm2arm\mes documents\visual studio 2008\projects\mstgraph\trace_ids\trace_ids.cpp(133) : error C2975: 'strComparator' : invalid template argument for 'N', expected compile-time constant expression 
1>  c:\documents and settings\arm2arm\mes documents\visual studio 2008\projects\mstgraph\trace_ids\trace_ids.cpp(47) : see declaration of 'strComparator' 
1>  c:\documents and settings\arm2arm\mes documents\visual studio 2008\projects\mstgraph\trace_ids\trace_ids.cpp(146) : see reference to function template instantiation 'void intersect_by<IDf,particlesID_set>(const MultiIndexContainer &,const MultiIndexContainer &,std::string,Tag *)' being compiled 
1>  with 
1>  [ 
1>   MultiIndexContainer=particlesID_set, 
1>   Tag=IDf 
1>  ] 
1>c:\documents and settings\arm2arm\mes documents\visual studio 2008\projects\mstgraph\trace_ids\trace_ids.cpp(133) : error C2955: 'strComparator' : use of class template requires template argument list 
1>  c:\documents and settings\arm2arm\mes documents\visual studio 2008\projects\mstgraph\trace_ids\trace_ids.cpp(47) : see declaration of 'strComparator' 
1>c:\documents and settings\arm2arm\mes documents\visual studio 2008\projects\mstgraph\trace_ids\trace_ids.cpp(134) : error C2784: '_OutElem *std::set_intersection(_InIt1,_InIt1,_InIt2,_InIt2,_OutElem (&)[_Size],_Pr)' : could not deduce template argument for '_OutElem (&)[_Size]' from 'std::insert_iterator<_Container>' 
1>  with 
1>  [ 
1>   _Container=particlesID_set 
1>  ] 
1>  c:\program files\microsoft visual studio 9.0\vc\include\algorithm(4064) : see declaration of 'std::set_intersection' 
1>c:\documents and settings\arm2arm\mes documents\visual studio 2008\projects\mstgraph\trace_ids\trace_ids.cpp(134) : error C2780: '::std::_Enable_if<!std::_Is_checked_iterator<_OutIt>::_Result,_OutIt>::_Result std::set_intersection(_InIt1,_InIt1,_InIt2,_InIt2,_OutIt)' : expects 5 arguments - 6 provided 
1>  c:\program files\microsoft visual studio 9.0\vc\include\algorithm(4004) : see declaration of 'std::set_intersection' 
1>c:\documents and settings\arm2arm\mes documents\visual studio 2008\projects\mstgraph\trace_ids\trace_ids.cpp(134) : error C2780: '_OutElem *std::set_intersection(_InIt1,_InIt1,_InIt2,_InIt2,_OutElem (&)[_Size])' : expects 5 arguments - 6 provided 
1>  c:\program files\microsoft visual studio 9.0\vc\include\algorithm(3993) : see declaration of 'std::set_intersection' 
1>c:\documents and settings\arm2arm\mes documents\visual studio 2008\projects\mstgraph\trace_ids\trace_ids.cpp(134) : error C2780: '::std::_Enable_if<std::_Is_checked_iterator<_OutIt>::_Result,_OutIt>::_Result std::set_intersection(_InIt1,_InIt1,_InIt2,_InIt2,_OutIt)' : expects 5 arguments - 6 provided 
1>  c:\program files\microsoft visual studio 9.0\vc\include\algorithm(3983) : see declaration of 'std::set_intersection' 
1>Build log was saved at "file://c:\Documents and Settings\arm2arm\Mes documents\Visual Studio 2008\Projects\mstgraph\trace_ids\Debug\BuildLog.htm" 
1>trace_ids - 12 error(s), 0 warning(s) 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 
+0

Многие из нас используют C++, но не VC++ конкретно, поэтому мы не имеем возможности узнать, что означает "C2975". Пожалуйста, разместите полный текст сообщения об ошибке, как часть вашего вопроса, используя копию и вставку. – 2010-03-17 09:25:19

+0

извините сообщения об ошибке в странном формате ... – Arman

+0

@Arman Затем переформатируйте их. – 2010-03-17 09:33:06

ответ

2

Я подозреваю, что вместо

template<int N> struct strComparator; 

вы хотите

template<typename T> struct strComparator; 

template <> struct strComparator<Id>{...}; //etc 
+0

Perfect !!! спасибо. – Arman

0

В догадке, strComaparator определяется как что-то вроде:

template <int X> 
// rest of definition here 

При использовании такого шаблона, вещь в угловых скобках должна быть всегда компиляции постоянного времени. Но вы используете компаратор:

strComparator<Tag>() 

где тег - переменная - вы не можете этого сделать.

+0

, но в примере форсирования мы используем следующие и работает: \t print_out_by (L1.data); где: шаблон <имяТипа Tag, имяТипа MultiIndexContainer> аннулируются print_out_by ( Const MultiIndexContainer & s, Tag * = 0/* устанавливает MSVC++ 6.0 ошибка с неявной функции шаблона Parms */ ) { Const имяТипа наддува: : multi_index :: index :: type & i = get (s); typedef typename MultiIndexContainer :: value_type value_type; /* сбрасывать элементы индекса в cout */ std :: copy (i.begin(), i.end(), std :: ostream_iterator (std :: cout)); } – Arman

+0

@Arman Извините, это не поможет. Пожалуйста, подтвердите определение strComparator. – 2010-03-17 09:51:02

Смежные вопросы