我们的想法是创建一个将容器类型作为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,请随意指出。内联关键字会有帮助吗?
提前致谢。
修改: 发布整个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)
答案 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;
}