2011-09-25 16 views
5

Tengo dificultades para encontrar una buena razón por la cual no se compila el siguiente código. Me da el siguiente error.No se puede usar el argumento de la plantilla en la declaración de función

error 2 error C2923: 'std :: par': 'std :: set :: iterador' no es un argumento de tipo de plantilla válido para el parámetro '_Ty1'

necesito un poco de conocimiento , en cuanto a por qué C++ no me permite usar el parámetro de plantilla en la declaración de función, porque utilizo el conjunto < int> :: iterator en lugar de establecer < T> :: iterator, el programa funciona.

#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); 
} 

Respuesta

9

Todo lo que necesita es la palabra clave "nombre de tipo". Como su función de impresión está templada con T, debe decirle al compilador que set :: iterator no es un valor sino un tipo. Así es como.

#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); 
} 
1

es necesario decirle al compilador que set<T>::iterator es un tipo. Usted hace que el uso de la palabra clave typename, de la siguiente manera:

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

Parece que necesita la palabra clave antes de typenameset<T>::iterator. Esto se debe a que el compilador no sabe que set<T>::iterator es un tipo, ya que set<T> no es una creación de instancias específica. set<T>::iterator podría ser cualquier cosa y el compilador asume que es un miembro estático por defecto. Entonces, necesita typename set<T>::iterator para decirle que iterator es un tipo. No necesita esto para set<int> porque es una instanciación específica y el compilador conoce todos sus miembros.

Cuestiones relacionadas