为了账号安全,请及时绑定邮箱和手机立即绑定

C++ template问题?

C++ template问题?

C++
繁华开满天机 2019-05-10 11:07:21
C++ template问题
查看完整描述

3 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

template <class Type>
struct listNode
{
Type number;
listNode<Type> *link;
}
因为你的listNode是一个模版,只有给出具体的类型参数,编译器才能推导出具体的代码。
你在使用中struct listNode<int> i;那么就得到了一个保存整数类型的节点,
struct listNode<float> f; 就得到了一个保存浮点类型的节点f。如果你不给出类型,编译器怎么知道生成什么样子的代码呢。

改写一般是这样子的

template <class _Ty>
class LinkedList
{
public:
struct listNode
{
_Ty number;
listNode<_Ty> *link;
};
typedef typename listNode<_Ty> * listNodePtr;
public:
LinkedList(){;};
void addNode(_Ty node);

......其他方法
}

用的时候
LinkedList<int> list;
LinkedList<int>::listNode node;
LinkedList<int>::listNodePtr pNode;
list.addNode(node);



查看完整回答
反对 回复 2019-05-13
?
DIEA

TA贡献1820条经验 获得超2个赞

实现模板实例化是编译器的编译期行为,编译期按不同类型参数实例化模板,并且目前而言编译器一般不会有通用且有效的优化行为(因为模板中的类型参数自由度很高,编译器无法判断哪个类或函数的模板实例化版本是不需要的而可以用另一些版本代替)。因此如果调用的不同类型参数数量比较多,的确会造成很明显的代码膨胀导致最终目标文件体积明显增加。如果要减少目标文件体积,可以限制调用的类型参数的实例数,例如在不同的类之间尽可能使用继承而不是直接当作相互无关的模板类型参数(不过这样可能会略损失运行期性能,尤其是使用虚继承时;另外面向对象范型相对于泛型而言,运行期限制更多,灵活性略差,有时候可能不得不多写一些重复代码)。
至于函数调用是目标代码的运行期行为,目标代码已经生成好了(由于是本机代码,不会保存类型等元信息),和模板无关(模板在编译早期展开后就可以当作不存在了)。

查看完整回答
反对 回复 2019-05-13
  • 3 回答
  • 0 关注
  • 758 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信