2012-06-15 5 views
1

Я хочу определить вспомогательную функцию, которая принимает параметр шаблона. Я попытался сделать шаблонную функцию для этого, но он не компилируется. Любая идея, что я делаю неправильно? Вот код, который я пробовал.Объявление функций, которые принимают параметры шаблона

// vectors are great, but lack a find method. Implement one as a helper. 
template<class T> bool vec_find(vector<T> &v, T obj) 
{ 
    vector<T>::iterator s; 
    for (s = v.begin(); s < v.end(); s++) 
    { 
     if (*s == obj) 
     { 
      return true; 
     } 
    } 
    return false; 
} 
+0

Вы разместили это в файле заголовка? Какая ошибка компилятора? – GregC

+7

Используйте 'std :: find'. –

+3

Думаю, вам понадобится 'typename' before' vector :: iterator'. Кроме того, вы никогда не должны использовать 's chris

ответ

1

Предположительно, ваш компилятор рассказал вам, в чем проблема. Mine сказал:

test.cpp:7:5: error: need ‘typename’ before ‘std::vector<T>::iterator’ because ‘std::vector<T>’ is a dependent scope 

Так, чтобы исправить это, добавьте typename перед тем vector<T>::iterator:

typename vector<T>::iterator s; 
^^^^^^^^ 

В общем, вам нужно, что всякий раз, когда область видимости имени типа зависит от параметра шаблона; пока экземпляр шаблона не будет создан, компилятор не знает, как будет определено vector<T>, и поэтому должно быть сказано, что имя, включенное в него, относится к типу, а не к чему-то другому.

Однако есть веская причина, почему vector не имеет метода find: библиотека C++ отделяет контейнеры от алгоритмов, действующих на них, так что любой алгоритм может действовать в любой подходящей последовательности. Вы хотите использовать std::find для этого:

return std::find(v.begin(), v.end(), obj) != v.end(); 
+0

Я просто понял, что ОП никогда не говорил, что проблема была в заголовке функции. По какой-то причине я думал, что они сделали: p – chris

+0

Спасибо! std :: find() - отличное решение. – user1459315