模板函数给出编译错误

Template function giving compilation error

本文关键字:编译 错误 函数      更新时间:2023-10-16

可能重复:
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\ceep\my documents\visual studio 2010\projects\level 7\exercise 2\exercise 2\sum.h(34):错误C4430:缺少类型说明符-假定为int。注意:C++不支持默认的int

1> c:\documents and settings\keep\my documents\visual studio 2010\projects\level 7\exercise 2\exercise 2\sum.h(34):错误C2143:语法错误:在"<"之前缺少",">

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

几件事:1.我试过用打字名,但可能错了。模板还不是我的强项。如果某个地方需要typename,请随意指出。内联关键字会有帮助吗?

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

提前感谢。

编辑:过帐整个头文件。按照建议添加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

错误出现在:双和(常量映射和输入)

这就是您需要typenames:的地方

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++很宽容(而且不符合),所以它不是主要错误。

您应该使用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;
}