欢迎各位来讨论,关于模板的

genius_hb 2006-12-11 03:47:58
怎么能实现一个类模板在一个编译单元中只能被一种类型(该类型不用规定)实例化(Instantiation).其实就是让这个模板只被实例化一次.
如:
template <class T>
class A;


A<int> a;
A<float> b; //error ,实例化了2次.

如何能实现这样的情况.
以上纯粹的技术讨论,没有什么实际用途.希望各位发表高见

...全文
438 27 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
taodm 2006-12-12
  • 打赏
  • 举报
回复
标准和现实间的差距,没啥需要奇怪的。
OOPhaisky 2006-12-12
  • 打赏
  • 举报
回复
疑惑中,为什么c++ templates的解法在g++上不好用呢?
奇怪...
xxelement 2006-12-12
  • 打赏
  • 举报
回复
这个不知道,最近也在看这个方面,只不过是范型。
assassin5616 2006-12-11
  • 打赏
  • 举报
回复
让人想起了孔已几
genius_hb 2006-12-11
  • 打赏
  • 举报
回复
多谢大家的回复,还希望有高人给出更精妙的答案
顶一下,呵呵
rongcanf 2006-12-11
  • 打赏
  • 举报
回复
呵呵,挺有意思的,楼主看书看的很透彻啊~
v2002750 2006-12-11
  • 打赏
  • 举报
回复
谢谢楼上指点,惭愧,赶紧看书去,哈哈
taodm 2006-12-11
  • 打赏
  • 举报
回复
v2002750() ,你没搞清楚实例化模板和创建模板实例的对象是2个不同的名词。
比如,我只写cout << sizeof(A<int>) << sizeof(A<float>)也会对A实例化2次的,而你的代码就没用了。
v2002750 2006-12-11
  • 打赏
  • 举报
回复
咋没人评价一下我交的代码呢,小菜我认真做了啊,郁闷。
BluntBlade 2006-12-11
  • 打赏
  • 举报
回复
尽量不用Friend就完了。Friend的耦合比Inherit还强,不到关键时候用它做甚。
taodm 2006-12-11
  • 打赏
  • 举报
回复
modern c++ design的代码,绝大部分能在devcpp(gcc3.4)/BCB6/VC6都正确。
所以,它是个实用库。
genius_hb 2006-12-11
  • 打赏
  • 举报
回复
发贴时我说过了:这只是纯粹的技术讨论.
运用语言的特性,实现某种特殊功能.

至于实现,确实很多都不符合标准.我们不能因此就认为
modern c++ design
c++ template metaprogramming
等书籍没有任何意义吧,因为他上面的代码在大多数编译器下均不能通过.
这些讨论确实没有意义,就当是学究派的人饭后谈资吧
taodm 2006-12-11
  • 打赏
  • 举报
回复
如果我写的代码不能至少在devcpp(gcc3.4)/BCB6/VC6的2个以上正确,我就放弃这段代码。
genius_hb 2006-12-11
  • 打赏
  • 举报
回复
呵呵,楼上的说的是.
taodm 2006-12-11
  • 打赏
  • 举报
回复
标准和现实间的差距,太多的方法都将成为“不可实用”,也就不能算“解”。
v2002750 2006-12-11
  • 打赏
  • 举报
回复
讨论讨论没用的东西也挺有意思,又不花很大心思,我们浪费过多少时间去做了多少蠢事,又何必在意这一点点时间呢,题外话,呵呵。
v2002750 2006-12-11
  • 打赏
  • 举报
回复
小弟菜鸟,不知道这样算不算?多了一曾间接:
#include <iostream>

using std::cout;
using std::endl;

bool flag = false;

template<class T> class TempTest{
private:
T data;
private:
TempTest(T t):data(t){}
public:
static TempTest<T>* GetTempTest(T t){
if(!flag){
flag = true;
return new TempTest<T>(t);
}
else{
return 0;
}
}
void printData(){
cout<<data<<endl;
}
};

void main(){
TempTest<int> *p = TempTest<int>::GetTempTest(5);
p->printData();

TempTest<int> *q = TempTest<int>::GetTempTest(6);
q->printData();
}
owlling 2006-12-11
  • 打赏
  • 举报
回复
friend的问题可以通过模板特化解决
genius_hb 2006-12-11
  • 打赏
  • 举报
回复
我说了,这个不是我乱想出来的,我没到达这个程度,摘自 C++ templates complete guide
作者说到:这个friend函数定义于一个类模板中,当这个类模板被多次实例化时,该函数会产生多个完全一样的定义,这违反了ODR(一次定义原则).
cunsh 2006-12-11
  • 打赏
  • 举报
回复
mark
加载更多回复(7)

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧