9

estoy tratando de seguir los ejemplos de esta página:Cómo usar boost :: error_info correctamente?

http://www.boost.org/doc/libs/1_40_0/libs/exception/doc/motivation.html

En el momento en que trato la siguiente línea:

throw file_read_error() << errno_code(errno); 

Me aparece un error:

error C2440: '<function-style-cast>' : cannot convert from 'int' to 'errno_code' 

¿Cómo hago para que esto funcione?

Lo ideal sería que quieren crear algo como esto:

typedef boost::error_info<struct tag_HRESULTErrorInfo, HRESULT> HRESULTErrorInfo; 

Pero no se puede incluso que los primeros ejemplos de trabajo.

Editar: Aquí es un breve ejemplo de lo que genera C2440 de error para mí:

struct exception_base: virtual std::exception, virtual boost::exception { }; 
struct io_error: virtual exception_base { }; 
struct file_read_error: virtual io_error { }; 

typedef boost::error_info<struct tag_errno_code,int> errno_code; 

void foo() 
{ 
    // error C2440: '<function-style-cast>' : cannot convert from 'int' to 'errno_code' 
    throw file_read_error() << errno_code(errno); 
} 
+0

¿Podría publicar un ejemplo mínimo completo que está intentando compilar al obtener el error C2440? –

+0

Ver el ejemplo en el enlace. No pude hacer que 'throw file_open_error() << errno_code (errno);' funcione. –

+0

Agregó un ejemplo. –

Respuesta

6

Sam Miller me dieron una pista sobre cuál era el problema. Sólo tenía que incluir:

#include <boost/exception/all.hpp>

Gracias por sus respuestas.

+7

¿Por qué demonios se ha bajado la respuesta correcta? Ese #include corrige el código que publiqué anteriormente. –

+0

Un ejemplo de un error relacionado con la plantilla para el cual el mensaje de error del compilador no está relacionado con la causa del problema. Gracias por esto. –

13
#include <boost/exception/all.hpp> 

#include <boost/throw_exception.hpp> 

#include <iostream> 
#include <stdexcept> 
#include <string> 

typedef boost::error_info<struct my_tag,std::string> my_tag_error_info; 

int 
main() 
{ 
    try { 
     boost::throw_exception(
       boost::enable_error_info(std::runtime_error("some error")) 
       << my_tag_error_info("my extra info") 
       ); 
    } catch (const std::exception& e) { 
     std::cerr << e.what() << std::endl; 
     if (std::string const * extra = boost::get_error_info<my_tag_error_info>(e)) { 
      std::cout << *extra << std::endl; 
     } 
    } 
} 

produce

[email protected]> ./a.out 
some error 
my extra info 
2

intento:

#include <boost/exception/error_info.hpp> 
#include <errno.h> 

throw file_read_error() << boost::errinfo_errno(errno); 

aún mejor :

BOOST_THROW_EXCEPTION(file_read_error() << errinfo_errno(errno)); 

Su ejemplo HRESULTErrorInfo parece correcto.

+0

Gracias por el ejemplo, tuve el << fuera del BOOST_THROW_EXCEPTION(). –

Cuestiones relacionadas