2017-02-08 11 views
-1

Я изучаю Липманна, и я только изучаю. Я пытаюсь здесь написать код, который вернет минимальный элемент в вектор. Когда я компилирую свой код в Codeblocks, он говорит: «Объявление шаблона не может появляться в области блока». Вот код:Объявление шаблона не может появляться в области кадра

#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

На самом деле вы можете просто использовать 'std :: min_element'. –

+0

Я думаю, здесь дело в том, что OP пытался понять, как реализовать такой шаблон функции. – SU3

ответ

2

Вы не можете определить шаблон внутри функции, и main является функцией. Вам необходимо определить свой шаблон функции min за пределами основного, перед ним.

У вас еще есть другие проблемы с кодом.

template <class elemType> 

должно отображаться непосредственно перед определением функции. Помещение

elemType save; 

между ними неправильный синтаксис.

Другая проблема - ваш алгоритм для выбора значения min в векторе. Почему у вас есть этот

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

и этот

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

в то же время?

Вот что вы, вероятно, хотите:

#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; 
} 

Если вам нужно обрабатывать пустые векторов, вы можете добавить

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

в начале функции, или возвращает итератор вместо ссылки элемента , так как end() хорошо определен даже для пустых векторов.

+0

Большое спасибо – FishTheBig

+0

Выполнено :) Да, именно это я и хотел. Ваш ответ велик, спасибо за внимание :) – FishTheBig

+0

Этот код имеет * много ошибок компиляции и не рассматривает случай пустого вектора. 'min' должен возвращать итератор, а не элемент, или утверждать, что вектор не пуст. Конечно, в реальном коде можно было бы просто использовать 'std :: min_element'. –