1

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

这个想法是创建一个将容器类型作为模板参数的函数。由于与其他顺序容器相比,地图必须以不同的方式求和,我重载了地图的 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):错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持默认整数

1>c:\documents and settings\keep\my documents\visual studio 2010\projects\level 7\exercise 2\exercise 2\sum.h(34): error C2143: 语法错误: ',' before '<'

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

几件事: 1. 我尝试使用 typename 但我可能错了。模板还不是我的强项。如果某处需要类型名,请随时指出。内联关键字会有帮助吗?

  1. 相同的代码在我的 Guide 机器上编译得很好。我的是 VC++ 2010 Express SP1。我不知道他的 VC++ 版本是什么。

提前致谢。

编辑:发布整个头文件。按照建议添加类型名。但同样的错误。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& input)

4

4 回答 4

1

这是你需要typenames的地方:

typename map<T1,T2>::const_iterator iter_begin=input.begin();
typename map<T1,T2>::const_iterator iter_end=input.end();
于 2012-11-23T17:31:40.143 回答
1

你已经猜到了——你需要typename. 粗略地说,规则是,如果你指的是一个类型 using::并且左边的东西::依赖于模板参数,你必须使用typename. 所以在你的情况下:

typename map<T1,T2>::const_iterator iter_begin=input.begin();
typename map<T1,T2>::const_iterator iter_end=input.end();
于 2012-11-23T17:33:58.520 回答
1

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

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

于 2012-11-23T18:08:32.297 回答
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;
}  
于 2012-11-23T17:35:51.780 回答