有关C++泛型编程的错误

An error about C++ generic programming

本文关键字:错误 泛型编程 C++ 有关      更新时间:2023-10-16
#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那么简单,但它仍然取决于模板参数。