| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4058 人关注过本帖, 1 人收藏
标题:模板函数/模板类实例化问题
只看楼主 加入收藏
韩海0312
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2012-8-11
结帖率:83.33%
收藏(1)
已结贴  问题点数:20 回复次数:14 
模板函数/模板类实例化问题
问题描述
对下面每条带标签的语句,解释发生了什么实例化(如果有的话),如果一个模板被实例化,解释为什么,
如果一个模板没有被实例化,解释为什么没有。

代码如下
程序代码:
template <typename T> class Stack { };

void f1(Stack<char>);                   // (a)

class Exercise {
    Stack<double> &rsd;                 // (b)
    Stack<int>    si;                   // (c)
};

int main() {
    Stack<char> *sc;                    // (d)
    f1(*sc);                            // (e)
    int iObj = sizeof(Stack< string >); // (f)
}
是不是这样的
1. a, b和d没有实例化。
2. c, f只实例化了类, 没有实例化任何类成员
3. e, 实例化了Stack<char> 同时实例化了copy 构造函数

上面的答案经过测试得出的结论,
但是不知道原理是怎样的?
难道是依据是否分配内存为准? 如果是这样的话,c 和 f也没分配内存啊

求指教?


[此贴子已经被作者于2017-6-12 17:25编辑过]

搜索更多相关主题的帖子: color 标签 
2017-06-12 16:27
l291920497
Rank: 2
等 级:论坛游民
帖 子:1
专家分:10
注 册:2017-6-13
收藏
得分:10 
首先,我也是一个刚入行不久的人,不能确定我说的全对,但是我说出自己的看法,希望对你有所帮助

首先你申明了一个模版类,但是模版类中并没有使用typename T 这个T实例化类成员,你可以尝试sizeof(Stack<char/int/double>) 应该只有一个字节,这一个字节不代表分配了内存,只是相当于编译器在内存中为这个类做了一个标识.(大概是这样,具体你需要自行去查询)
你的以上所有Stack<T> 的成员都没有实例化.
就相当于 C 语言的 #define 一样.
#define T  (int)

class Stack<T>{
  T  a;//int  a
  T  b;//int  b
}
其实相当于把T字符简单替换而已.
希望对你有所帮助,如果我有说错的地方希望各位大神指出一下,这样我也能学习到新的东西,谢谢,共勉
2017-06-13 14:02
韩海0312
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2012-8-11
收藏
得分:0 
回复 2楼 l291920497
我也是小菜,共同学习

分享下,我这这类问题的想法
我将上面的代码在加一个func的定义结果有些变化

程序代码:
template <typename T> class Stack { };

void f1(Stack<char>);                   // (a)

class Exercise {
    Stack<double> &rsd;                 // (b)
    Stack<int>    si;                   // (c)
};

void f1(Stack<char> g)                   // (g)
{
}

int main() {
    Stack<char> *sc;                    // (d)
    f1(*sc);                            // (e)
    int iObj = sizeof(Stack< string >); // (f)
}

(g)实例化,但未实例化任何成员
(g) 和 (a)的区别是一个是声明,一个是定义,(定义在调用时是要分配内存的)
是否实例化的关键是看是否将要分配该类型的对象内存(强调“将要”是因为函数定义时,型参其实没有分配内存,是在调用时定义的)
另外你说sizeof结果为一个字节的问题,原因在于我们的类没有数据成员(定义的非虚成员函数,不占实例的内存,它们只属于类型(不知道怎么表达对不对))
sizeof本来应该是0,但是类的对象实例一定是要占用一定内存的,否在无法使用这些对象,至于占用多大,要看使用的编译器

上面的a~g 应该是这样的

(a) 声明,不分配内存,不实例化
(b) 和 (d) 类是引用和指针不需要实例化
(c) 需要实例化,将会分配内存
(e) 实例化copy constructor
(f) 实例化
2017-06-14 19:23
韩海0312
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2012-8-11
收藏
得分:0 
回复 3楼 韩海0312
你可以测试上面的结果,我已经测试过,解释不一定对,仅供参考
2017-06-14 19:25
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:10 
全是实例化,而且全是最直白的显式实例化(explicit instantiation)
2017-06-14 20:30
韩海0312
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2012-8-11
收藏
得分:0 
回复 5楼 rjsp
你是说,使用显示实例化要使用的版本,避免这一类问题的发生么?
2017-06-15 09:37
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
模版定义处之外,用具体类型替换掉模版的所有参数就是实例化
2017-06-15 19:12
韩海0312
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2012-8-11
收藏
得分:0 
回复 7楼 rjsp
那你的说法,
(a) void f1(Stack<char>);
(b) Stack<double> &rsd;
(d) Stack<char> *sc;
这些该怎么解释呢, 这些用具体的实参替换形参, 但是这些没有实例化
2017-06-15 19:53
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
你说的“实例化”是不是c++中的instantiation?
模版的实例化就是指由模版产生一个类
类的实例化就是指由类产生一个对象
2017-06-15 21:15
韩海0312
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2012-8-11
收藏
得分:0 
回复 9楼 rjsp
你说的挺好, 我很赞同, 可是模板是什么时候实例化的呢,
这个才是我们一直关注的问题,我问题中描述中例子,他们遵循一个什么样的规则实例化,
我想知道这个
2017-06-16 14:35
快速回复:模板函数/模板类实例化问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.220283 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved