【发布时间】:2017-11-09 01:27:53
【问题描述】:
此代码使用 MSVC 2015 编译,但不能使用 Clang 5.0.0(主干 304874)编译:
template <typename T>
struct Base
{
T data;
};
template <typename T>
struct Derived : Base<T>
{
auto getData() const
{
return data;
}
};
将data 替换为Derived::getdata() 中的this->data 会让Clang 高兴。
根据 C++ 标准,哪个编译器是正确的?
必须在模板代码中使用this-> 才能访问基类的标识符吗?
【问题讨论】:
-
msvc 显然是错误的。
data是从属名称。 -
clang 正确,msvc 错误。
-
MSVC 在两阶段查找规则方面被破坏了,其中包括依赖名称。
-
带有
/permissive-开关的 MSVC 2017 会为此代码发出错误“C2065: 'data': undeclared identifier”。
标签: c++ templates inheritance language-lawyer name-lookup