2016-08-09 3 views
0

У меня есть следующий код, и я хочу создать шаблон для размера контейнеров (например, векторы, массивы, список и т. Д.) В основном я определяю вектор, и я вызываю функцию mysize из шаблона, но получаю сообщение об ошибке: msgstr "посмотреть объявление mysize". Может кто-нибудь помочь?Шаблон для контейнеров, где ошибка?

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

using namespace std; 

template <typename I, typename Op> 
Op mysize(I first, I last) 
{ 
    auto it = 0; 
    while (first != last) { 
     ++first; 
     it += 1; 
    } 
    return it; 
} 

void main() 
{ 

    vector<int> v = {1,2,3,4,5,6,7,8}; 
    auto _begin = v.begin(); 
    auto _end = v.end(); 

    auto result = mysize(_begin, _end); 

} 
+4

'недействительным основной()' не хорошо, это C++ - это должно быть ' int main() '. – ArchbishopOfBanterbury

+2

Как можно предположить, какой тип вы имеете в виду для 'Op'? –

+1

Это не ошибка. Это конечная часть ошибки. Какая ошибка? –

ответ

6

Тип Op не может быть выведен.

Это должно работать:

template <typename I, typename Op = std::size_t> 
Op mysize(I first, I last) 
{ 
    auto it = 0; 
    while (first != last) { 
     ++first; 
     it += 1; 
    } 
    return it; 
} 

Или:

template <typename I> 
std::size_t mysize(I first, I last) 
{ 
    std::size_t it = 0; 
    while (first != last) { 
     ++first; 
     ++it; 
    } 
    return it; 
} 

Или:

template <typename I> 
std::size_t mysize(I first, I last) 
{ 
    return std::distance(first, last); 
} 
+0

ok vincent, это была проблема, большое спасибо ... теперь он запускает – billythekid

+0

или задает параметры шаблона при вызове mysize? – aichao

+0

Я считаю, что 'std :: ptrdiff_t' будет более подходящим типом в этом случае. – NathanOliver

Смежные вопросы