c++ - c++ 孙子看不到抽象祖父母的数据
问题描述
以下 C++ 代码无法编译:
class Val
{
protected:
int n;
public:
Val() : n(0) {}
Val(int nn) : n(nn) {}
virtual int blah() const = 0;
};
template <class T>
class subVal : public Val
{
public:
subVal() : Val() {}
int blah() const { return n; }
};
template <class T>
class subsubVal : public subVal<T>
{
public:
subsubVal() : subVal<T>() {}
int blah() const { return n; } // this is the "faulty" line
int blahblah() const { return n; }
};
subsubVal<int> ssv; // declare an instance, to confirm that it can be done
编译器 (VisualStudio) 说“C2065 'n' 未声明的标识符”。
如果我将标记为“故障”的行替换为
int blah() const { return Val::n; } // replacement line
然后它编译好了。
我认为,失败与这里的 Val 是一个抽象类这一事实有关,因为获得成功编译的另一种方法是注释掉 Val 类中 blah() 的纯虚函数声明。请注意,孙方法 blahblah() 不会产生编译器错误。我认为这也与模板有关,因为如果删除模板,代码就会编译(但当然我想在整个项目中进行模板;这只是说明这一点的一个片段)。另请注意,孩子在看到父母中的数据值 n 时没有问题。只是孙子没有看到它。
我首先希望得到一个澄清逻辑的答案(因为我的未编译代码在我看来是合乎逻辑的),然后是一个比在孙子的代码中粘贴大量可怕的“Classname::”标识符更好的解决方案。(实际上,这些标识符的名称会更长,并且会大大降低代码的自然性和可读性)。
解决方案
推荐阅读
- authentication - 用于 JAX-RS 过滤器的 cookie 中的 Keycloak 令牌
- predis - predis 和 phpredis 哪个更好?
- selenium - 如何使用新值更新文本框并使用 selenium Web 驱动程序检查计数
- sql - N天前的日期
- woocommerce - Woocommerce 基于角色的电子邮件
- c# - 如何查找函数/接口/等的描述
- xml - 使用 xslt 更改所有特殊字符的标签?
- javascript - 仅省略号文本上方的 Ag-grid 工具提示
- python - Postgresql 触发器检查哪些列值发生了变化?
- c# - 如何将 csproj 文件添加到团队资源管理器?