c++ - 将派生模板类分配给基类模板
问题描述
这似乎是不可能的,但我认为拥有我想要的东西是合理的。我有以下代码:
template <typename T>
class Data{
T getData() {
return data;
}
private:
T data;
};
template <typename T>
class Base : public Data<T> {
public:
void someCommonAction() { }
};
class DerivedInt : public Base<int> {
};
class DerivedFloat : public Base<float> {
};
我想将派生对象分配给Base
类,但编译器抱怨模板参数是必需的Base
:
Base b = DerivedInt{};
我知道Base
类模板本身并不是一个完整的类,但是这样的要求对我来说是很合理的。有没有其他方法可以实现我想要的?
解决方案
明白Base类模板本身并不是一个完整的类,但是这样的要求对我来说还是很合理的。有没有其他方法可以实现我想要的?
合理但需要模板参数推导;所以从 C++17 开始,你可以添加一些东西
template <typename T>
Base(Base<T>) -> Base<T>;
和
Base b = DerivedInt{};
应该管用。
题外话:观察
template <typename T>
class Data{
T getData() {
return data;
}
private:
T data;
};
该getData()
方法是私有的
我想你的意图是公开
模板
class Data{
public:
T getData() {
return data;
}
private:
T data;
};
或做Data
一个struct
推荐阅读
- python - 按其他字典或列表自定义字典排序列表
- algorithm - 这是欧几里得算法的正确实现吗?
- javascript - 无法将我的节点应用程序与 mongoDB 地图集连接
- javascript - 传递某些参数时出错
- laravel - 语法错误或访问冲突:1055 'laravelapp.ltd.no_of_days' 不在 Laravel 的 GROUP BY 中
- python - 使用 Selenium 和 Python 从列表中选择一个项目
- php - Host不愿意增加group_concat_max_len怎么办
- python - 如何从 jupyter 笔记本中的文件夹访问文件名
- c# - 无法让存储过程与 C# Winform 中的日志记录任务并行运行
- ssis - SSIS 问题从雪花中提取数据 - [CData 雪花源] 错误:获取数据错误:收到的元数据版本号不兼容