9

sto cercando di seguendo gli esempi in questa pagina:Come usare boost :: error_info correttamente?

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

Nel momento provo la seguente linea:

throw file_read_error() << errno_code(errno); 

ottengo un errore:

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

Come faccio a farlo funzionare?

Idealmente voglio creare qualcosa di simile:

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

Ma non può anche ottenere i primi esempi di lavorare.

Edit: Ecco un breve esempio di ciò che genera C2440 di errore per me:

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

Potresti postare un esempio minimale completo che stai cercando di compilare quando ricevi l'errore C2440? –

+0

Visualizza l'esempio sul link. Non ho potuto ottenere 'gettare file_open_error() << errno_code (errno);' per funzionare. –

+0

Aggiunto un esempio. –

risposta

6

Sam Miller mi ha dato un indizio su quale fosse il problema. Avevo solo bisogno di includere:

#include <boost/exception/all.hpp>

Grazie per le vostre risposte.

+7

Perché diavolo è stata downvoted la risposta corretta ?? Quel # include il codice che ho postato sopra. –

+0

Un esempio di errore relativo al modello per il quale il messaggio di errore del compilatore non è completamente correlato alla causa del problema. Grazie per questo. –

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

prova:

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

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

ancora meglio :

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

L'esempio HRESULTErrorInfo sembra corretto.

+0

Grazie per l'esempio, ho avuto il << all'esterno di BOOST_THROW_EXCEPTION(). –

Problemi correlati