Нельзя использовать аргумент шаблона в объявлении функции
Я изо всех сил пытаюсь найти вескую причину, почему следующий код не компилируется. Это дает мне следующую ошибку.
Ошибка 2 ошибка C2923: 'std::pair': 'std::set::iterator' не является допустимым аргументом типа шаблона для параметра '_Ty1'
Мне нужно немного разобраться, почему C++ не позволяет мне использовать параметр шаблона в объявлении функции, потому что я использую set
#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