模板函数给出编译错误

可能重复:
std :: map :: const_iterator模板编译错误

这个想法是创建一个将容器类型作为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> 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> c: documents and settings keep my documents visual studio 2010 projects level 7 exercise 2 exercise 2 sum.h(34):error C2143:syntax error:missing','before'<'

这个函数是头文件的一部分。 我的头文件也包含函数定义。

几件事情:1.我尝试了typename,但我可能错了。 模板并不是我的强大领域。 随意指出是否需要typename。 内联关键字将有所帮助?

  • 相同的代码在我的指南机器上编译得很好。 我的是VC ++ 2010 Express SP1。 我不知道他的VC ++版本是什么。
  • 提前致谢。

    编辑:发布整个标题file.With类型名称添加建议 。 但同样的错误。 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(常量映射和输入)


    这是你需要typename s的地方:

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

    你猜对了 - 你需要typename 。 粗略地说,规则是如果你使用::来引用一个类型,而::依赖于模板参数,那么你必须使用typename 。 所以在你的情况下:

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

    你忘了#include <map> ,你也应该用std限定词来限定它的名字,因为那是map生命。

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

    链接地址: http://www.djcxy.com/p/57001.html

    上一篇: Template function giving compilation error

    下一篇: const TypedeffedIntPointer not equal to const int *