模板函数给出编译错误

时间:2012-11-23 17:30:02

标签: c++ templates

  

可能重复:
  std::map::const_iterator template compilation error

我们的想法是创建一个将容器类型作为Template参数的函数。由于地图必须与其他顺序容器相比有所不同,因此我重载了地图的Sum函数,如下所示。

这是给我错误的功能:

template<typename T1, typename T2>
double Sum(const map<T1,T2>& input)
{
double finalSum=0;
map<T1,T2>::const_iterator iter_begin=input.begin();
map<T1,T2>::const_iterator iter_end=input.end();

for(iter_begin; iter_begin!=iter_end; ++iter_begin)
{
    finalSum=finalSum+(iter_begin)->second;
}
return finalSum;
}

错误:

1&gt; c:\ documents and settings \ keep \ my documents \ visual studio 2010 \ projects \ level 7 \ exercise 2 \ exercise 2 \ sum.h(34):error C4430:缺少类型说明符 - 假定为int。注意:C ++不支持default-int

1&gt; c:\ documents and settings \ keep \ my documents \ visual studio 2010 \ projects \ level 7 \ exercise 2 \ exercise 2 \ sum.h(34):error C2143:语法错误:缺少','之前'&LT;'

此函数是头文件的一部分。我的头文件也包括函数定义。

很少的事情: 我尝试使用typename,但我可能错了。模板不是我强大的领域。如果某处需要typename,请随意指出。内联关键字会有帮助吗?

  1. 相同的代码在我指南的机器上编译正常。我的是VC ++ 2010 Express SP1。 我不知道他的VC ++版本是什么。
  2. 提前致谢。

    修改: 发布整个Header文件。按建议添加typename 。但同样的错误。 Sum的第一个版本正在编译,没有typename。为地图重载的第二个是给出问题。

    #ifndef SUM_H
    #define SUM_H
    
    template<typename T>    
    double Sum(const T& input)                                                  
    {
    double finalSum=0;
    T::const_iterator iter_begin=input.begin();
    T::const_iterator iter_end=input.end();
    
    for(iter_begin; iter_begin!=iter_end; ++iter_begin)
    {
        finalSum=finalSum+(*iter_begin);
    }
    return finalSum;
    }
    
    
    //Mysterion !!!!!
    template<typename T1, typename T2>
    double Sum(const map<T1,T2>& input)
    {
    double finalSum=0;
    typename map<T1,T2>::const_iterator iter_begin=input.begin();
    typename map<T1,T2>::const_iterator iter_end=input.end();
    
    for(iter_begin; iter_begin!=iter_end; ++iter_begin)
    {
        finalSum=finalSum+(iter_begin)->second;
    }
    return finalSum;
    }   
    
    #endif
    

    错误发生在: double Sum(const map&amp; input)

4 个答案:

答案 0 :(得分:1)

这是您需要typename s:

的地方
typename map<T1,T2>::const_iterator iter_begin=input.begin();
typename map<T1,T2>::const_iterator iter_end=input.end();

答案 1 :(得分:1)

您已经猜到了 - 您需要typename。粗略地说,规则是,如果您使用::引用类型而::左侧的内容取决于模板参数,则必须使用typename。所以在你的情况下:

typename map<T1,T2>::const_iterator iter_begin=input.begin();
typename map<T1,T2>::const_iterator iter_end=input.end();

答案 2 :(得分:1)

您忘记了#include <map>,并且您还应该使用std限定符来限定其名称,因为这是map所在的位置。

不要过分担心typename(尽管添加它们会很好)因为VC ++是宽松的(并且不符合要求)所以它不是主要错误。

答案 3 :(得分:0)

您应该使用typename,因为const_iterator是一个从属名称(此术语的搜索,您会找到许多解释):

typename map<T1,T2>::const_iterator iter_begin=input.begin();
typename map<T1,T2>::const_iterator iter_end=input.end();

那看起来很难看。

在C ++ 11中,auto让您的生活变得轻松:

auto iter_begin=input.cbegin(); //use cbegin, instead of begin
auto iter_end=input.cend();     //use cend, instead of end

或基于范围的for循环:

for(auto item : input)
{ 
   finalSum = finalSum + item.second;
}