有关C++泛型编程的错误
An error about C++ generic programming
#include<iostream>
#include "stdlib.h"
using namespace std;
#include<vector>
#include<iterator>
template <typename type1>
vector<type1> map(vector<type1> &my_vec, type1 (*my_fun)(type1)){
vector<type1> result_vec;
for(vector<type1>::iterator iter = my_vec.begin(); iter != my_vec.end() ; iter++){
result_vec.push_back(my_fun(*iter));
}
return result_vec;
}
在这个程序中,我想写一个map函数(类似于python中的函数),但是出了点问题,编译器告诉我:
In function 'std::vector<type1> map(std::vector<type1>&, type1 (*)(type1))':
[Error] need 'typename' before 'std::vector<type1>::iterator' because 'std::vector<type1>' is a dependent scope
[Error] expected ';' before 'iter'
[Error] 'iter' was not declared in this scope
问题出在哪里?(当我将"type1"更改为"int"时,一切正常)
错误消息非常直接地告诉您需要做什么。 更改:
for(vector<type1>::iterator iter = my_vec.begin(); iter != my_vec.end() ; iter++){
。自:
for(typename vector<type1>::iterator iter = my_vec.begin(); iter != my_vec.end(); iter++){
使用当前的 (c++11) 编译器,最好重写它以避免(显式)迭代器完全使用:
for (auto const & i : my_vec)
result_vec.push_back(my_fun(i));
不过,这些只能解决短期语法问题。有几个更大的问题。首先,map
已经在标准库中(具有完全不同的含义),因此最好避免使用该名称。
更大的问题是,这整个事情几乎只是对(一元版本)std::transform
的模仿,而且你通常最好只使用std::transform
而不是尝试编写自己的。
至于为什么它适用于int
而不是vector<type1>::iterator
的隐含问题:这实际上相当简单:编译器总是"知道"int
(作为完整的标记)是一种类型。它不能用于其他任何事情。
在模板中,编译器不会"知道"像T::foo
这样的名称(其中T
是模板参数)是类型的名称还是成员变量之类的名称。若要消除歧义以支持类型名称,可以显式指定typename
。在您的情况下,表达式并不像T::foo
那么简单,但它仍然取决于模板参数。
相关文章:
- 使用泛型编程的基本数据结构
- 在泛型编程中使用新的放置
- 在泛型编程中选择类型参数
- 在泛型编程C++重载增量运算符
- 处理C++泛型编程中的空分配
- 有关C++泛型编程的错误
- 在泛型编程中,需要在派生类中重新声明基类成员函数
- 将泛型编程与多态性混合在一起
- C++泛型编程 CRTP 基类继承自派生类型提供的类
- 泛型编程中带有关键字模板的规范
- 为什么泛型编程设计更喜欢自由函数而不是成员函数
- c++如何在泛型编程中声明自定义数组
- C++函数式和泛型编程[使用MySQL连接器示例]
- 继承和虚函数与泛型编程
- 虚函数与泛型编程
- 只使用<泛型编程中的比较
- c++泛型编程与模板和nullptr
- c++中的泛型编程和类中的类型定义
- 如何在c++中使用泛型编程来代替多态性
- 概念与复制构造函数冲突的泛型编程