c++ - 使用模板实现派生类
问题描述
我有一个模板化的基类A
和模板化的派生类B
定义,headers.h
实现去source.cpp
下面的代码无法编译,因为x
不在B
. 问题是我做错了什么?我发现如果A
没有模板化,代码编译得很好(有相关的更改)。
// headers.h
template <typename T>
class A
{
public:
T x;
}
template <typename T>
class B : public A<T>
{
void foo(); // do something with x
}
// source.cpp
#include headers.h
template <typename T>
void B<T>::foo() {} // do something with x
// explicit instantiation
template class B<double>;
解决方案
下面的代码不编译,因为
x
不在范围内B
A<T>
是类模板的基类B
:
template<typename T>
class B: public A<T> {
// ...
};
虽然成员x
fromA<T>
实际上是从 in 继承的B
,但在 in 中找不到它,B
因为在x
内部使用时B
,不会在其基类中查找该名称A<T>
。原因是在依赖模板参数的基类中默认不执行名称查找(基类A<T>
依赖于 的模板参数B
,即T
)。对于要从x
中查找的名称,您需要将其表示为或。A<T>
B
this->x
A<T>::x
我发现如果
A
没有模板化,代码编译得很好
在这种情况下,基类不依赖于模板参数,因此x
在基类中进行查找,即使您不将其表示为or ,也x
可以从中找到成员。B
this->x
A::x
推荐阅读
- powershell - Add-SBHost : 系统找不到指定的文件
- java - Java C# 的 goto 等价物
- polymorphism - rails中的多态关联
- java - gradle:从 5005 更改默认端口
- java - 如何解码`javax.ws.rs.core.Cookie`中的客户端Cookie字符串
- c# - 从 FTP 下载的文件作为流,不能作为文件流打开?
- http - 如何从 Common Lisp/dexador 中的 http 地址下载并保存图像?
- python - 用 python 从 wikipedia 中抓取表格:无法获取列
- javascript - 仅查找以单引号或双引号开头的所有单词的正则表达式
- php - 谷歌字体突然停止在 Wordpress 网站上工作