синтаксис объявления шаблона функции - PullRequest
2 голосов
/ 12 декабря 2011

Я пытаюсь создать шаблонную функцию, которая принимает векторный аргумент любого типа T (пока что примитив) и распечатывает его содержимое:

template<class T>
void displayContents(const vector<T>& data)
{
    vector<T>::const_iterator i;
    i=data.begin();

    for( ; i!=data.end(); i++){
        cout<<*i<endl;
    }
}

Сообщение об ошибке:

В функции 'void displayContents (const std :: vector> &)': error: Ожидается ';'перед "я" |ошибка: 'i' не было объявлено в этой области === Сборка завершена: 2 ошибки, 0 предупреждений ===

Я пропускаю синтаксическую ошибку?

Ответы [ 2 ]

5 голосов
/ 12 декабря 2011

Попробуйте следующее:

  typename vector<T>::const_iterator i;

Как уже указывал Бьерн в комментарии, это необходимо, потому что это зависимое имя шаблона.

3 голосов
/ 12 декабря 2011

Если ваша цель - вывести каждый элемент, вы не должны ограничиваться векторами. Идиоматическое, общее решение состоит в том, чтобы вместо этого передать два итератора:

template<typename ForwardIterator>
void display_contents(ForwardIterator begin, ForwardIterator end)
{
    for (ForwardIterator it = begin; it != end; ++it)
    {
        std::cout << *it << '\n';
    }
}

Тогда вы можете использовать шаблон с векторами, наборами и практически всеми другими контейнерами:

int main()
{
    std::vector<int> a {2, 3, 5, 7};
    display_contents(a.begin(), a.end());

    std::set<int> b {11, 13, 17, 19};
    display_contents(b.begin(), b.end());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...