问题描述
以下 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 时没有问题。只是孙子没有看到它。
我首先希望得到一个澄清逻辑的答案(因为我没有编译的代码对我来说看起来合乎逻辑),然后找到一个比在代码中粘贴大量可怕的“类名::”标识符更好的解决方案孙子。 (在实践中,这些标识符的名称会更长,并且会大大降低代码的自然性和可读性)。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)