2017-02-08 2 views
-1

J'apprends Lipmann et j'étudie seulement. J'essaye ici d'écrire un code qui retournera un élément minimal dans un vecteur. Lorsque je compile mon code dans Codeblocks, il dit: "Une déclaration de modèle ne peut pas apparaître à la portée du bloc". Voici le code:Une déclaration de modèle ne peut pas apparaître à la portée du bloc

#include <vector> 
#include <algorithm> 
#include <iostream> 

using namespace std; 

int main() 
{ 
    template <class elemType> 
    elemType save; 
    elemType min (const std::vector<elemType> &vec) { 
     std::vector<elemType>::iterator it = vec.begin(), end_it = vec.end(); 
     std::vector<elemType>::iterator iter = std::next(it, 1); 
     for (; it != end_it; it++) { 
     if (*it < *(it + 1)) { 
      save = *it; 
     } 
     if (save < *it) { 
      save = *it; 
     } 
     } 
    }; 

    int massiv[10] = {35, 66, 98, 15, 32, 41, 24, 90, 55, 100}; 
    std::vector<int> vec_train(massiv,massiv+10); 


    min(vec_train); 
    return 0; 
} 
+1

En fait, vous pouvez simplement utiliser 'std :: min_element'. –

+0

Je pense que le point ici est que OP essayait de comprendre comment implémenter un modèle de fonction comme ça. – SU3

Répondre

2

Vous ne pouvez pas définir modèle dans une fonction et main est une fonction. Vous devez définir votre modèle de fonction min en dehors de la fonction principale, avant celle-ci.

Vous avez plusieurs autres problèmes dans votre code. Le

template <class elemType> 

doit apparaître immédiatement avant la définition de la fonction. Mettre

elemType save; 

entre eux n'est pas correcte syntaxe.

Un autre problème est votre algorithme pour sélectionner la valeur min dans un vecteur. Pourquoi avez-vous cette

if (*save < *(it + 1)) { save = *it; } 

et ce

if (*save < *it) { save = *it; } 

en même temps?

Voici ce que vous voulez sans doute:

#include <vector> 
#include <algorithm> 
#include <iostream> 

using namespace std; 

template <class elemType> 
const elemType& min(const std::vector<elemType>& vec) { 
    typename std::vector<elemType>::const_iterator 
    select = vec.begin(), 
    it = std::next(select), 
    end = vec.end(); 
    for (; it != end; ++it) { 
    if (*it < *select) select = it; 
    } 
    return *select; 
}; 

int main() { 
    int massiv[10] = {35, 66, 98, 15, 32, 41, 24, 90, 55, 100}; 
    std::vector<int> vec_train(massiv,massiv+10); 

    std::cout << min(vec_train) << std::endl; 
    return 0; 
} 

Si vous devez manipuler des vecteurs vides, vous pouvez ajouter

if (!vec.size()) throw std::length_error("empty vector passed to min"); 

au début de la fonction, ou retourner un itérateur au lieu de référence de l'élément , comme end() est bien défini même pour les vecteurs vides.

+0

Merci beaucoup – FishTheBig

+0

Fait :) Oui, c'est exactement ce que je voulais. Votre réponse est excellente, merci de votre attention :) – FishTheBig

+0

Ce code a * de nombreuses erreurs de compilation et ne considère pas le cas d'un vecteur vide. 'min' devrait retourner un itérateur, pas un élément, ou affirmer que le vecteur n'est pas vide. Bien sûr, en code réel, il suffit d'utiliser 'std :: min_element'. –