LINUX.ORG.RU

C++ exception object constructor. «Не вызывается»


0

0

Суть проблемы:
есть код(вставляю только проблемный участок):

file.hpp:

class assertion_failed : public spectra::exceptions::logic_error
{
public:
	explicit assertion_failed(const char* desc) throw(spectra::exceptions::allocation_error);
};
.....................

some_file.cpp:
#include "some_file.hpp"
..........
		void _assertion_failed(const char* func_name, const char* assert_expression,
							  const char* file, int line) throw(spectra::exceptions::assertion_failed)
		{
			std::ostringstream out;
			out << "Assertion failed in " << func_name << ": " << assert_expression
				<< " is false. File: " << file << ". Line: " << line;
			
			throw(out.str().c_str());
		}

При компиляции вылетает:

spectra/macros/debug/debug.cpp: In function ‘void spectra::_macros_implementation::_safe_call_failed(const char*, const char*, int, int, const char*, int)’:
spectra/macros/debug/debug.cpp:29: ошибка: нет подходящей функции для вызова ‘spectra::exceptions::bad_safe_call::bad_safe_call(spectra::exceptions::bad_saf
e_call)’
./spectra/macros/debug/debug.hpp:100: замечание: претенденты: spectra::exceptions::bad_safe_call::bad_safe_call(spectra::exceptions::bad_safe
_call&)
spectra/macros/debug/debug.cpp:29: ошибка:   в throw-выражении


В чем причина? Как лечить?
anonymous

Код выше неправильно откопи-пастен
throw(out.str().c_str());
на самом деле
throw(spectra::exceptions::assertion_failed(out.str().c_str()));


причем с throw(spectra::exceptions::assertion_failed("Test")); тоже самое


а вот:
spectra::exceptions::assertion_failed ex(out.str().c_str());
throw(ex);
работает корректно

anonymous
()
Ответ на: комментарий от anonymous

> throw(new spectra::exceptions::assertion_failed(out.str().c_str()));

сомневаюсь..

dilmah ★★★★★
()
Ответ на: комментарий от k_andy

Дело не в конструкторе копирования, я бы сказал что поведение такое, как-будто в конструкторе класса assertion_failed нету слова explicit, и в throw(spectra::exceptions::assertion_failed(out.str().c_str())); он сначала неявно преобразует out.str().c_str() к spectra::exceptions::assertion_failed а потом ищет конструктор spectra::exceptions::assertion_failed(spectra::exceptions::assertion_failed);

но так не должно быть даже если бы не было explicit, есть же explicit assertion_failed(const char* desc) throw(spectra::exceptions::allocation_error)

Не думаю что это глюк gcc... Надеюсь кто-нибудь укажет где я ошибся...

anonymous
()
Ответ на: комментарий от anonymous

С проблемой разобрался. В базовом классе был член с конструктором my_type(my_type&), а не my_type(const my_type&), соответственно implicit copy constructor был не возможен...

Все-таки k_andy был прав =)

А моя ошибка - думал что копи конструктор сам сделается

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.