假设我们有这样的结构:
namespace some_namespace::types {
using foo_t = int;
}
namespace some_namespace::classes {
class bar {
public:
auto do_stuff() -> types::foo_t;
};
}
using namespace some_namespace::classes;
auto bar::do_stuff() -> types::foo_t {
return 1;
}
这段代码在GCC6中编译得非常愉快
另一方面,启用了/std:c++latest
开关的VS15无法识别do_stuff
的返回类型。它返回C2653。
现在,我发现非常可疑的是,通过将后半部分改为此来解决这个问题:
using namespace some_namespace;
auto classes::bar::do_stuff() -> types::foo_t {
return 1;
}
在我眼里应该是平等的。我错误地认为这是一个MSVC错误?标准对此有何看法?
答案 0 :(得分:4)
这与C ++ 17功能无关,它没有触及using-directives,也没有使用using-directives。 MSVC从
产生相同的错误namespace some_namespace{
namespace types {
using foo_t = int;
}
namespace classes {
class bar {
public:
auto do_stuff() -> types::foo_t;
};
}
}
using some_namespace::classes::bar;
auto bar::do_stuff() -> types::foo_t {
return 1;
}
对于类
X
的成员,在[...]的定义中使用了[...] 遵循X
定义之外的类成员 成员的 declarator-id ,应在以下其中一项中声明 方法:
- 中使用之前
在用于使用它的块之前或在封闭块([stmt.block])或
应该是类
X
的成员,或者是X
([class.member.lookup])基类的成员,或者[...关于嵌套和本地类的两个要点......]
如果
X
是名称空间N
[...]的成员,则在使用名称之前,在名称空间N
或N
之一中封闭名称空间。
types
的名称查找应首先查看bar
内部,然后查看classes
内部,然后查看some_namespace
内部。最后一个应该找到名称空间types
。