Error C2679: Binario>>: No se encontró ningún operador (o no hay una conversión aceptable) que acepte un operando derecho de tipo 'const char[5]'.
Puedes compilarlo si cambias typedef set::const _ iterator CIT; a typedef set::const _ iterator CIT;!
Has terminado de hacer tus preguntas, pero todavía tengo algo que decir. Si el código de tu libro es realmente así, puedes tirarlo a la basura. No merece la pena verlo en absoluto, es engañoso y perjudicial para la gente. Por supuesto, te diré el motivo:
Pecado original 1:
El prototipo de la definición de clase de plantilla de colección es
template & ltclass T, / / set::key_type /value_type
clase Comparar = menos, //set::key _ Comparar/valor _ Comparar
clase Alloc = asignador //set::allocator _ tipo
& gt class set;
El primer parámetro aquí es el tipo de datos que desea almacenar. El segundo y tercer parámetro son opcionales. El segundo parámetro es menos. objeto (operador de paréntesis sobrecargado) y su definición es la siguiente:
Sin estructura de plantilla: función_binaria {
Operador booleano () (const T & ampx, const T & ampy)const { return Ordenar por signo mayor que); ¡no hablemos del tercero!
Entonces, typedef set::const _ iterator CIT; estrictamente hablando, esto es incorrecto y no puedes imaginar qué va a hacer. Como criterio de clasificación, ¿la cadena es más grande que el símbolo? ¿Menos que un símbolo? Acabo de comprobar y descubrí que la cadena no sobrecarga el operador(), por lo que no es un objeto de función, ¡pero no sé si se puede compilar con VS2013 y G++!
Pecado original 2:
Echemos un vistazo a la definición de esta función de plantilla. Obviamente no es un pensamiento orientado a objetos, sino un pensamiento orientado a procesos (lenguaje C). modo.
Plantilla
Exposición nula (CIT & ampit, set & amps)
{
for(it = s . comenzar() ; }
cout & lt& ltendl
}
¿Cuál es la práctica de C++?
Plantilla
No válida display (const set & amps)
{
for(typename set::const _ iterator citar = s . comenzar(); citar != s . end(); ++ citar )
{
cout & lt& lt* citar & lt& lt"\ t";
}
cout & lt& ltendl
}
Déjame explicarte, la función genera cada elemento en el contenedor de colección. Obviamente, sólo es necesario pasar un parámetro. ¿Por qué hay dos? Qué extraño.
Pecado original tres: (Esta parte se puede discutir)
Mira este maravilloso código nuevamente.
const int N = 5;
cadena s1[N]={"mick", "bill", "gate", "rose", "Jane"}; p>
cadena s1[N]={"mick", "bill", "gate", "rose", "Jane"}; p>
Cadena s2[N]={"Zhang Feng", "Qin Ping","Li Li","Fang Lu","Hu Tao"};
establecer nombre 1;
p>nombre1.insert(s1, s 1+N );
setname2(s2, S2+N);
Primero, aquí se definen dos matrices temporales s1 y s2. Desde esta perspectiva, se trata de utilizar la lista de inicialización única de la matriz (el conjunto también es compatible después del estándar C++ 11), ¡pero en este ejemplo no podemos ver los beneficios de dicho uso!
Y los métodos de construcción de nombre1 y nombre2 son diferentes (el primero usa el constructor predeterminado + insertar función miembro, el segundo usa un constructor específico), lo cual obviamente es difícil de explicar en este programa.
Un método más apropiado es:
Nombre de colección 1;
nombre 1. insert(" Mick ");
nombre 1 insertar(" factura ");
nombre 1 . insertar(" puerta "
nombre 1 . 1. insert("Jane");
Nombre de la colección 2;
Nombre2.insert("Zhang Feng");
Nombre2.insert("Qin Ping");
nombre 2. insert(" Lili ");
Nombre2.insert("Fanglu");
Nombre2.insert(" Hu Tao");
Está claro de un vistazo, por lo que algunas personas pueden decir que si hay demasiados elementos, el código será feo. De hecho, debes colocar estas cadenas en un archivo y luego léalos por el programa. Utilice insert para insertar en la colección.
Pecado original 4:
cout & lt& ltEncuentra el primer elemento en nombre2 que sea mayor que "Li Li". \ n ";
cit = nombre 2 . Upper _bound(" Li Li ");
cout & lt& lt*cit<.& ltendl
Establecer En inglés, está ordenado según el diccionario, pero los caracteres chinos no son muy seguros. Por ejemplo, el resultado de ejecutar G++ en Linux es:
Encuentre el primer elemento que sea mayor que
<. p. >Qin PingNota: El orden del segundo lugar es: Zhang Feng, Li Li, Qin Ping, Hu Tao y Fang Lu (no en orden pinyin)
En Windows El resultado de ejecutar VS es:
Encontrar el primer elemento en nombre2 que sea mayor que
Fanglu (en orden pinyin)
Así que no hay caracteres chinos. se utilizan aquí. ¡No hay objeción a usar palabras en inglés como ejemplo!
Pecado original 5:
El diseño, la sangría y la estandarización de todo el programa parecen amateurs a primera vista. Código C ++ de hace mucho tiempo. Lo arreglé especialmente.
Echemos un vistazo:
#includes
#includes
#includes
Uso del espacio de nombres estándar
Plantilla
Visualización no válida (const set & amps)
{
for(typename set::const _ iterator citer = s . comenzar(); citer ! = s . end(); ++citar)
{
cout & lt& lt* citar & lt& lt”\t”;
}< /p >
cout & lt& ltendl
}
int main()
{
Establecer nombre;
nombres . nombres . insert(" rose ");
names insert(" Jane ");
cout & lt& lt"Emite el nombre de cada elemento:"
Display(name);
cout & lt& lt"Encuentre el primer elemento en el nombre que sea mayor o igual a."
set::const _ iterator cit = nombres . lower _bound(" x-men ");
if (cit!= nombres.end()) {
cout & lt& lt*cit <. & ltendl
} En caso contrario {
cout & lt& ltLo sentimos, no se encuentra ningún elemento mayor o igual a
}
Devuelve 0 ;
}
1, #include eliminado
2. Reescribe la función de plantilla de visualización.
3. Se ha eliminado el nombre 2 y se ha cambiado el nombre 1 por nombre.
4. Utilice inserciones múltiples en lugar de inserciones de matriz más.
5. Intente usar endl en lugar de "\n"
6. Utilice const_iterator en lugar de iterator porque su valor no se modifica.
7. Determine el valor de retorno de cit, tal como está escrito en el programa. Si no se puede encontrar, se puede procesar correctamente; si no se puede encontrar el programa original, se colgará.
8. Utilice espacios y saltos de línea de forma racional para que el programa sea atractivo y condicional.
Si puedes entenderlo, te recomiendo que leas un buen libro, "C++ Primer".