模板函数给出编译错误
Template function giving compilation error
可能重复:
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,请随意指出。内联关键字会有帮助吗?
- 同样的代码在我的指南机器上编译得很好我的是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
错误出现在:双和(常量映射和输入)
这就是您需要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++很宽容(而且不符合),所以它不是主要错误。
您应该使用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;
}
- std::is_base_of表示ctor编译错误
- Qt5:使用QCommandLineParser类时出现奇怪的编译错误
- 如何修复sfml c++代码编译错误
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- vscode下的Arduino代码出现意外编译错误
- 第三方 API 中的编译错误 - Visual Studio
- std::cout输出int时出现编译错误
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- 提升图广度优先搜索前置编译错误
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- 我在C++中遇到了这个奇怪的编译错误
- 在C++中使用 Catch 测试框架编译错误"error: expected ';' at end of declaration list"
- 使用 std::enable_if 限制派生类的模板参数时出现编译错误
- 现代OpenGL和GLEW Libraray的编译错误
- C++ 编译错误:意外的类型名称"字符串":预期的表达式
- C ++程序编译错误,找不到/访问文件
- 使用直接大括号初始化时,C++ 编译错误"声明末尾的预期";"
- 为什么传递非静态成员函数会导致编译错误?