命名空间名为' exception'导致编译问题

时间:2014-03-25 07:27:05

标签: c++ exception namespaces

我遇到名为" 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)使用&#34; ::&#34;限定命名空间在第12行

AnotherException() : ::exception::MyException() { }

2)将命名空间重命名为例如&#34;例外&#34;

是什么原因,名称空间&#34;例外&#34;导致混乱?我知道有一个类std :: exception。这会造成麻烦吗?

2 个答案:

答案 0 :(得分:22)

  

我知道有一个班级std::exception。这会造成麻烦吗?

是。在std::exception内,非限定名称exception注入的类名。这是继承的,所以在你的班级中,一个不合格的exception指的是那个,而不是你的命名空间。

答案 1 :(得分:10)

+1给@Mike Seymour的回答!作为补充,有比现有解决方案更好的方法来防止模糊:

只需使用MyException,无需任何名称空间限定:

struct AnotherException : public exception::MyException
{
    AnotherException() : MyException() { }
};

LIVE EXAMPLE

或者使用C ++ 11的继承构造函数:

struct AnotherException : public exception::MyException
{
    using MyException::MyException;
};

LIVE EXAMPLE