我有模板类,其中包括两个嵌套类,如下所示
#include <iostream>
template<typename A>
class c
{
class a
{
protected:
int i = 0;
};
class b: public a
{
public:
void print()
{
std::cout << "i of a: " << i; // fails
//std::cout << "i of a: " << this->i; // works
}
};
};
这提供了顺应性
error: use of undeclared identifier 'i'
。我预计失败与依赖于模板参数的类 a 相关,但这里的情况似乎并非如此,因为 a 不依赖于 A。
我尝试阅读有关模板中的从属名称的信息,但我仍然不确定为什么会发生此错误。有人可以解释这种行为的理论原因吗?
令人惊讶的是,这在 MSVC 上编译没有问题,但在 GCC 和 Clang 中却没有。任何关于为什么 GCC/Clang 的行为与 MSVC 不同的见解都将不胜感激!
因为
不依赖于a
A
是的。你可以专攻
a
。
#include <iostream>
template<typename A>
class c
{
public:
class a
{
protected:
int i = 0;
};
class b: public a
{
public:
void print()
{
std::cout << "i of a: " << this->i; // works
}
};
};
template <>
class c<int>::a
{
// No `i`!
};
int main()
{
c<int>::b x;
x.print();
}
<source>:18:46: error: no member named 'i' in 'c<int>::b'
18 | std::cout << "i of a: " << this->i; // works
| ~~~~ ^