Как обрабатывать исключения методов шаблонного класса в C++

Рейтинг: 0Ответов: 1Опубликовано: 13.03.2023

Столкнулся с проблемой при попытке обработать исключение, которое выбрасывает конструктор шаблонного класса box. Для обработки внутри класса box был создан класс error. Требуется сделать, чтобы при попытке создать объект класса box со значением больше 10 выбрасывалось бы исключение error, которое будет ловить catch. Однако компилятор ругается, что в строке catch написано box::error, без указания типа box. Как следует записать это, учитывая, что box-шаблонный и может быть разных типов?

using namespace std;
template <class T>
class box{
private:
    int x;
public:
    class error {};
    box(T value){
        if (value > 10)
            throw error();
        else
            x = value;
    }
};
void main() {
    try {
        box<int> y(11);
    }
    catch (box::error) {
        cout << "ERROR";
    }
}

Ответы

▲ 1Принят

Правильное обращение в классу, вложенному в шаблонный класс должно включать имя родительского класса, а не имя шаблона. Т.е. box<int>::error вместо box::error.

Классы box<int>::error, box<double>::error и т.д. - различные классы, хотя они и сгенерированны из одного исходного кода. В таких случаях лучше писать:

class box_error {};

template <class T>
class box{
   ...
public:
  using error = box_error;
};

Тогда все типы box<...>::error будут синонимом одного типа, и его код не будет многократно дублироваться.

Еще лучше, код исключения сделать наследником std::exception, тогда все возможные исключения можно будет ловить одним catch(std::exception&)