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

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

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

Мне нужно немного понять, почему C ++ не позволяет мне использовать параметр шаблона в объявлении функции, потому что я использую set :: iterator вместо 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 ]

9 голосов
/ 25 сентября 2011

Все, что вам нужно, это ключевое слово 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);
}
3 голосов
/ 25 сентября 2011

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

1 голос
/ 25 сентября 2011

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

void print(const pair< typename set<T>::iterator, bool> &p) //<- Here is the problem
...