【问题标题】:Template with constant expression: error C2975 with VC++2008带有常量表达式的模板:VC++2008 的错误 C2975
【发布时间】:2010-03-17 09:09:24
【问题描述】:

我正在尝试使用元编程元素,但第一次尝试就碰壁了。 我想要一个比较器结构,可以如下使用:

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; 
    }

    };

我错过了什么?

亲切的问候 阿尔曼。

抱歉,我没有复制完整的错误消息。 完全错误:

>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 ==========

【问题讨论】:

  • 我们中的许多人使用 C++ 而不是专门使用 VC++,因此我们无法知道“C2975”是什么意思。请使用复制和粘贴的方式发布错误消息的全文,作为您问题的一部分。
  • 对不起,错误信息的格式很奇怪...
  • 我刚加了
    可以吗?
  • @Arman 在 SO 上格式化代码或错误时使用 HTML 标签不是一个好主意。只需选择要格式化的所有文本,然后单击文本输入区域上方的 1010 按钮。但现在可以了。
  • 谢谢,完成!顺便说一句,有没有办法格式化 cmets?

标签: c++ templates boost multi-index


【解决方案1】:

我怀疑不是

template<int N> struct strComparator;

你想要的

template<typename T> struct strComparator;

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

【讨论】:

    【解决方案2】:

    猜测,strComaparator 被定义为:

    template <int X>
    // rest of definition here
    

    当您使用这样的模板时,尖括号中的内容必须始终是编译时间常数。但是你使用了比较器:

    strComparator<Tag>()
    

    其中 Tag 是一个变量 - 你不能这样做。

    【讨论】:

    • 但在 boost 示例中,我们使用以下内容并且它有效: print_out_by(L1.data);其中: template void print_out_by( const MultiIndexContainer& s, Tag* =0 /* 使用隐式模板函数 parms / 修复 MSVC++ 6.0 错误) { const typename boost::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 抱歉,这无济于事。请确认strComparator的定义。
    猜你喜欢
    • 1970-01-01
    • 2018-08-04
    • 2014-06-02
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多