我遇到名为" 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。这会造成麻烦吗?
答案 0 :(得分:22)
我知道有一个班级
std::exception
。这会造成麻烦吗?
是。在std::exception
内,非限定名称exception
是注入的类名。这是继承的,所以在你的班级中,一个不合格的exception
指的是那个,而不是你的命名空间。
答案 1 :(得分:10)
+1给@Mike Seymour的回答!作为补充,有比现有解决方案更好的方法来防止模糊:
只需使用MyException
,无需任何名称空间限定:
struct AnotherException : public exception::MyException
{
AnotherException() : MyException() { }
};
或者使用C ++ 11的继承构造函数:
struct AnotherException : public exception::MyException
{
using MyException::MyException;
};