C ++, impresión de datos de cualquier tipo (plantilla T) a la consola -- ++ campo con templates campo con std camp Relacionados El problema

c++, printing data of any type (template T) to console


0
vote

problema

Español

En mi código, quiero implementar una función que imprime cualquier tipo de datos a la consola. La función siempre recibe un string como el primer argumento y un Datos que pueden variar cada vez como el segundo argumento.

mutex_loggers.h

  namespace Loggers {     std::mutex m_mutex;     template<typename T>     void sharedLog(const std::string& message, T data)     {         std::lock_guard<std::mutex> locker(m_mutex);         std::cout << message << data << std::endl;     } }   

y uno de los archivos que lo llama como por ejemplo. main.cpp

  $Username0  

En el tiempo de compilación recibo estos errores:

C2593 OPERADOR $Username1111 es ambiguo

C2679 BINARIO $Username2 No se ha encontrado ningún operador que realiza un operando de la mano derecha del tipo $Username3 (o no hay una conversión aceptable)

¿Cómo puedo tener una función que imprime algún tipo de datos

Original en ingles

in my code, I want to implement a function that prints any data type to console. the function always receives a string as the first argument and a data which can vary each time as the second argument.

Mutex_Loggers.h

namespace Loggers {     std::mutex m_mutex;     template<typename T>     void sharedLog(const std::string& message, T data)     {         std::lock_guard<std::mutex> locker(m_mutex);         std::cout << message << data << std::endl;     } } 

and one of the files which calls it like e.g. main.cpp

#include "Mutex_Loggers.h" /*other stuff*/ Loggers::sharedLog("IN THREAD: ", std::this_thread::get_id()); Loggers::sharedLog("IN APP CREATION ", nullptr); Loggers::sharedLog("IN create_CtrApp_and_register ", {1,2,3}); 

at compile time I get these errors:

C2593 operator << is ambiguous

C2679 binary << no operator found which takes a right-hand operand of type T (or there is no acceptable conversion)

How can I have function that prints any type of data

        
         
         

Lista de respuestas

3
 
vote

El problema es que está llamando operator<< para los tipos que no sobrecargan ese operador que luego llame a su función std::ostream& operator<< (std::ostream &out, const T& arg); 1 .

Para escribir una instancia de tipo T a un std::ostream de esta manera, debe sobrecargar operator<< .

El operador debe implementarse fuera del tipo T , y tendría la siguiente firma:

  std::ostream& operator<< (std::ostream &out, const T& arg);   

Si necesita acceder a miembros privados y protegidos de T , también debe declararse como amigo:

  friend std::ostream& operator<< (std::ostream &out, const T& arg);   

Debe devolver la referencia out9 que recibe como los primeros argumentos para que las llamadas puedan ser encadenadas:

  sharedLog0  

Puede encontrar más detalles aquí: HTTPS: / /www.learncpp.com/cpp-tutorial/93-overging-the-io-operators/

Operador C2593 & LT; & LT; es ambiguo

Tiene 2 o más implementaciones que son candidatas, y el compilador no sabe cuál elegir. El mensaje de error contiene detalles adicionales que apuntan a los candidatos para que pueda ver cuáles son los tipos de choque. Ver más aquí: Error C2593: 'Operador & LT; & LT;' es ambiguo

c2679 binario & lt; & lt; No se encontró ningún operador que toma un operando de la derecha de tipo T (o no hay conversión aceptable)

Usted está llamando sharedLog111111111/stipo que no lo sobregauta, como se describe al principio de mi respuesta.

 

The problem is that you are calling operator<< for types which don't overload that operator which you then call inside your sharedLog function.

In order to write an instance of type T to an std::ostream in this manner, you need to overload operator<<.

The operator should be implemented outside of T type, and it would have following signature:

std::ostream& operator<< (std::ostream &out, const T& arg); 

If it needs to access private and protected members of T, it should be also declared as friend:

friend std::ostream& operator<< (std::ostream &out, const T& arg); 

It should return the out reference it receives as the first arguments so that calls can be chained:

str << a << b << c; 

You can find more details here: https://www.learncpp.com/cpp-tutorial/93-overloading-the-io-operators/

C2593 operator << is ambiguous

You have 2 or more implementations which are both candidates, and compiler doesn't know which one to pick. The error message contains additional details which point to the candidates so you can see which are the clashing types. See more here: error C2593: 'operator <<' is ambiguous

C2679 binary << no operator found which takes a right-hand operand of type T (or there is no acceptable conversion)

You are calling operator<< for type which doesn't overload it, as described at the beginning of my answer.

 
 

Relacionados problema

0  Una forma adecuada de C ++ de implementar un Lock_Guard para la biblioteca personalizada  ( Proper c way of implementing a lock guard for custom library ) 
o wise interwebs Tenemos un impasse entre dos colegas que podríamos usar su ayuda resolviéndole en la forma adecuada de C ++. Básicamente, tenemos un conjun...

-4  ¿Los iteradores pueden volverse inválidos después de las operaciones? [duplicar]  ( Can iterators become invalid after operations ) 
Esta pregunta ya tiene respuestas aquí : cerrado 8 años atrás . posible duplicado: Iterato...

72  Error C2065: 'COUT': Identificador no declarado  ( Error c2065 cout undeclared identifier ) 
Estoy trabajando en la parte 'Driver' de mi asignación de programación y sigo recibiendo este error absurdo: Error C2065: 'COUT': identificador no declarad...

58  ¿Cómo se implementa Std :: String?  ( How is stdstring implemented ) 
Tengo curiosidad por saber cómo se implementa STD :: String y ¿cómo se diferencia de la cadena C? Si el estándar no especifica ninguna implementación, entonce...

5  Comprobando si un número complejo tiene nan  ( Checking if a complex number has nan ) 
Estoy tratando de verificar si un número std::complex es el resultado de una transformada de Fourier (usando > http://fftw.org/ ) contiene un NaN en la pa...

0  Acceso a un par anidado  ( Accessing a nested pair ) 
Para desmontar un par, se puede hacer lo siguiente boost::bind(&std::pair::second, _1); // returns the value of a pair ¿Qué hay de usar combinaciones d...

21  Cómo hash std :: cadena?  ( How to hash stdstring ) 
Estoy haciendo un poco de utilidad para ayudarme a recordar las contraseñas por repetición. Me gustaría ingresar la contraseña para recordarse solo una vez al...

7  Qt - Mezcla QT y STD :: Tipos de C ++  ( Qt mixing qt and std c types ) 
Más una pregunta personalizada y práctica, pero se considera una forma deficiente o altamente desaconsejable (elija su interpretación de la maldad) para mezcl...

254  ¿Puedes eliminar elementos de un STD :: LISTED mientras está itando a través de él?  ( Can you remove elements from a stdlist while iterating through it ) 
Tengo código que se parece a esto: for (std::list<item*>::iterator i=items.begin();i!=items.end();i++) { bool isActive = (*i)->update(); //if (!isA...

13  Error MINGW: 'MIN' NO ES UN MIEMBRO DE 'STD'  ( Mingw error min is not a member of std ) 
Estoy tratando de convertir un código VC ++ 6 a una aplicación de consola usando solo las bibliotecas estándar, pero estoy recibiendo el siguiente error de MI...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos