Пространство имен, называемое "исключение", приводит к компиляции проблем

У меня проблема с пространством имен, называемым "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;
};

ЖИВОЙ ПРИМЕР