Пространство имен, называемое "исключение", приводит к компиляции проблем
У меня проблема с пространством имен, называемым "exception"
Рассмотрим следующий пример заголовка:
#include <exception>
namespace exception
{
struct MyException : public std::exception
{};
}
struct AnotherException : public exception::MyException
{
AnotherException() : exception::MyException() { }
};
Этот заголовок не компилируется со следующей ошибкой:
namespacetest.hpp: In constructor 'AnotherException::AnotherException()':
namespacetest.hpp:12:48: error: expected class-name before '(' token
namespacetest.hpp:12:48: error: expected '{' before '(' token
Для этого есть два решения:
1) квалифицировать пространство имен с помощью "::" в строке 12
AnotherException() : ::exception::MyException() { }
2) Переименуйте пространство имен, например. "Исключительный"
В чем причина того, что пространство имен "исключения" приводит к путанице? Я знаю, что существует класс std:: exception. Это вызывает проблемы?
Ответы
Ответ 1
Я знаю, что существует класс std::exception
. Это вызывает проблемы?
Да. В std::exception
неквалифицированное имя exception
- это введенное имя класса. Это наследуется, поэтому в вашем классе неквалифицированный exception
относится к этому, а не к вашему пространству имен.
Ответ 2
+1 к @Mike Сеймур ответ! В качестве дополнения есть лучшие способы, чем ваше текущее решение для предотвращения неоднозначности:
Просто используйте MyException
без какой-либо квалификации пространства имен:
struct AnotherException : public exception::MyException
{
AnotherException() : MyException() { }
};
ЖИВОЙ ПРИМЕР
Или используйте функцию конструкторов с наследованием С++ 11:
struct AnotherException : public exception::MyException
{
using MyException::MyException;
};
ЖИВОЙ ПРИМЕР