#include <iostream>
#include <vector>
#include <iterator>
using namespace std;
template<typename T>
void factorial(vector<T> ivec, vector<T>::iterator iter) {
while (iter != ivec.end()) {
cout << *iter << endl;
++iter;
}
}
int main() {
vector<int> ivec = { 1,2,3,4,5,6,7 };
factorial(ivec, ivec.begin());
return 0;
}
Son message d'erreur dans VS 2017 est le suivant :
警告 C4346 “std::vector<T,std::allocator<_Ty>>::iterator”: 依赖名称不是类型 practice_needForCpp11 d:\practice_needforcpp11\practice_needforcpp11\源.cpp 8
错误 C2061 语法错误: 标识符“iterator” practice_needForCpp11 d:\practice_needforcpp11\practice_needforcpp11\源.cpp 8
错误 C2672 “factorial”: 未找到匹配的重载函数 practice_needForCpp11 d:\practice_needforcpp11\practice_needforcpp11\源.cpp 18
错误 C2780 “void factorial(std::vector<T,std::allocator<_Ty>>)”: 应输入 1 个参数,却提供了 2 个 practice_needForCpp11 d:\practice_needforcpp11\practice_needforcpp11\源.cpp 18
S'il vous plaît, dites-moi ce qui ne va pas ici~Merci~~
Changez deux positions,
Avant le changement : void factorial(vector<T> ivec, vector<T>::iterator iter)
Après le changement : void factorial(vector<T> & ivec, typename vector<T>::iterator iter)
Parlons d'abord du deuxième changement de position. À quoi sert le nom de type ? Référence http://blog.csdn.net/laojiu_/...
Je ne peux pas expliquer l'emplacement du premier changement s'il n'est pas cité, VS signalera une incompatibilité de type lors de la comparaison avec end(). . .
Lors de l'exécution sur Vs2008, une erreur sera signalée.
Les raisons de l'erreur sont :
(1) vector<int> ivec = {1,2,3,4,5,6,7} ; le vecteur ne peut pas être initialisé et affecté directement comme ceci. Vous pouvez le remplacer par ceci
(2) La fonction n'est pas bien écrite. Écrivez-la simplement comme ceci. Il n'est pas nécessaire de passer ivec.begin() à la fonction. Étant donné que vous avez déjà transmis ivec à la fonction, la fonction obtiendra toutes les informations d'ivec sans ajouter d'informations superflues.