Нельзя использовать аргумент шаблона в объявлении функции

Я изо всех сил пытаюсь найти вескую причину, почему следующий код не компилируется. Это дает мне следующую ошибку.

Ошибка 2 ошибка C2923: 'std::pair': 'std::set::iterator' не является допустимым аргументом типа шаблона для параметра '_Ty1'

Мне нужно немного разобраться, почему C++ не позволяет мне использовать параметр шаблона в объявлении функции, потому что я использую set:: iterator вместо set:: iterator, в котором работает программа.

#include<iostream>
#include<set>
using namespace std;

template <typename T>
void print(const pair< set<T>::iterator, bool> &p) //<- Here is the problem
{
    cout<<"Pair "<<*(p.first)<<" "<<p.second<<"\n";
}

int main() {
   set<int> setOfInts;
   setOfInts.insert(10);    
   pair<set<int>::iterator, bool  > p = setOfInts.insert(30);
}

3 ответа

Решение

Все, что вам нужно, это ключевое слово "typename". Поскольку ваша функция печати шаблонизируется с помощью T, вы должны сообщить компилятору, что set::iterator - это не значение, а тип. Это как.

#include<iostream>
#include<set>
#include <utility>
using namespace std;

template <typename T>
void print(const pair< typename set<T>::iterator, bool> &p) //<- Here is the problem
{
    cout<<"Pair "<<*(p.first)<<" "<<p.second<<"\n";
}

int main() {
   set<int> setOfInts;
   setOfInts.insert(10);    
   pair<set<int>::iterator, bool  > p = setOfInts.insert(30);
}

Кажется, вам нужно typename Ключевое слово перед set<T>::iterator, Это потому, что компилятор не знает, что set<T>::iterator это тип, как set<T> это не конкретный экземпляр. set<T>::iterator может быть чем угодно, и компилятор предполагает, что это статический элемент по умолчанию. Так вам нужно typename set<T>::iterator сказать ему, что iterator это тип. Вам не нужно это для set<int> потому что это конкретный экземпляр, и компилятор знает обо всех его членах.

Вы должны сказать компилятору, что set<T>::iterator это тип. Вы делаете это с помощью typename ключевое слово, как показано ниже:

void print(const pair< typename set<T>::iterator, bool> &p) //<- Here is the problem
Другие вопросы по тегам