Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Исключения в шаблоне


Автор: Kuvaldis 4.4.2007, 18:24
Всем доброго времени суток!
Код:
Код

//---------------------------------------------------------------------------
#include <iostream>
#include <conio.h>
using namespace std;
//---------------------------------------------------------------------------
template< class T >
class MyClass
{
     public:
       class xError{};  // класс исключения
       MyClass() { throw xError(); } // кидаем исключение в конструкторе
};

int main()
{
   try
   {
      MyClass< int > test;
   }
   catch ( MyClass< int  >::xError )
  // catch ( MyClass< class T >::xError )
   {
        cout << "Error" << endl;
   }
   getch();
   return 0;
}
//---------------------------------------------------------------------------

Если ловить исключение как MyClass< int  >::xError, то все нормально.
Проблемы при MyClass< class T >::xError 
Возможна ли вообще данная конструкция?

Буду рад конструктивной критике
P.S. Вроде в поиске ничего нужного не нашел.

Автор: Daevaorn 4.4.2007, 18:29
Цитата(Kuvaldis @  4.4.2007,  19:24 Найти цитируемый пост)
Проблемы при MyClass< class T >::xError Возможна ли вообще данная конструкция?

нет. выход - выность класс исключения из контекста класса MyClass.

Автор: Kuvaldis 4.4.2007, 18:36
Daevaorn, 
Цитата

нет. выход - выность класс исключения из контекста класса MyClass.

Эх, жаль smile 
Интересно, а почему так сделано?..

Автор: Daevaorn 4.4.2007, 19:08
Цитата(Kuvaldis @  4.4.2007,  19:36 Найти цитируемый пост)
Интересно, а почему так сделано?..

шаблоны полиморфны лишь на этапе компиляцйи, поэтому невозможно в рантайме сделать универсальный обработчик на базе шаблонов.

Автор: Earnest 4.4.2007, 21:43
Действительно, не конкретизировать класс-параметр можно только внутри шаблона, а снаружи всегда должны быть конкретные классы. И это не только к перехвату исключений относится. Можно рассматривать инстационирование шаблонов как вид препросессинга, а дальше должен быть совершенно конкретный код.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)