【问题标题】:namespace called 'exception' leads to compile problems名为“异常”的命名空间导致编译问题
【发布时间】:2014-03-25 07:27:05
【问题描述】:

我有一个名为“异常”的命名空间的问题

让我们考虑以下示例标题:

#include <exception>

namespace exception
{
  struct MyException : public std::exception
  {};
}


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

此标头无法编译并出现以下错误:

namespacetest.hpp:在构造函数“AnotherException::AnotherException()”中: namespacetest.hpp:12:48: 错误: '(' 标记之前的预期类名 namespacetest.hpp:12:48: 错误: '(' 标记之前的预期'{'

有两种解决方案:

1) 在第 12 行用 "::" 限定命名空间

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

2) 将命名空间重命名为例如“特殊”

命名空间“异常”导致混淆的原因是什么?我知道有一个类 std::exception。这会造成麻烦吗?

【问题讨论】:

    标签: c++ exception namespaces


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      +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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-26
        • 1970-01-01
        • 2016-09-01
        • 2012-07-19
        • 2013-09-13
        • 2014-05-09
        相关资源
        最近更新 更多