2010-07-16 2 views
0

Я столкнулся с разбитым компилятором, который не позволяет исключениям наследовать от std::exception (nvcc 3.0).C++ пользовательские исключения

поэтому пришлось создать обходной путь:

struct exception { 
    explicit exception(const char* message) { 
     what_ = message; 
    } 
    virtual const char *what() const throw() { return what_; } 
    operator std::exception() const { 
     return std::runtime_error(what_); 
    } 
private: 
    const char* what_; 
}; 

struct configuration_error : exception { 
    configuration_error(const char* message) 
     : exception(message) {} 
}; 

там что-то я буду терять, не унаследовав от исключения, вместо предоставления актеров? что необходимо в вышеуказанном случае?

спасибо

+0

Почему он не позволяет вам унаследовать его? (Ошибки?) Возможно, мы можем взломать его и включить наследование, или это просто просто «просто не может»? – GManNickG

+0

Каким образом это не позволяет получать из 'std :: exception'? BTW, вероятно, лучше наследовать один из типов '' ('std :: exception' даже не имеет полезного конструктора). - Кажется, что ваш обходной путь страдает от очень сомнительного способа хранения строки - уверены ли вы, что указатель может не стать недействительным в случае локальной строки? – UncleBens

+0

@GMan Я получаю ошибку 'external call to exception '. Это не имеет никакого смысла, поскольку это ошибка конкретной функции устройства. Это влияет только на попытку инициализации сложного объекта в конструкторе. Я уверен, что это ошибка компилятора, предыдущий компилятор (nvcc 2.x) не имел проблем – Anycorn

ответ

2

catch (std::exception) не привлечет ваше исключение, и вы не можете dynamic_cast ваше исключение std::exception либо. Если ваша программа никогда не делает ничего из этого, вы в порядке.

Лично я бы не использовал компилятор, этот сломанный.

+0

ну, это только один прямо сейчас для программирования cuda – Anycorn

0

Если вы пытаетесь создать экземпляр чего-либо, полученного из std :: exception на устройстве, это не сработает, потому что нужно будет вызвать конструктор std :: exception, и это не функция устройства ,

Бросок и ловля собственного типа, вероятно, является решением. Поскольку он, вероятно, никогда не вернется к хост-коду, хотя (C++ не справляется с одновременным отбрасыванием нескольких исключений), совместимость с std :: exception не должна быть слишком большой проблемой.

Смежные вопросы