模版 在代码里有几个 副本的有关问题

模版 在代码里有几个 副本的问题
类模版中的静态变量和静态成员函数和普通函数的问题


template<typename T>
class Test
{
T val;
public:
static  void Fun(){}

void Fun2(){}
};


Test<int> obj1;  
obj1.Fun();  
obj1.Fun2(); 
 
Test<int>obj2;  
obj2.Fun();   
obj2.Fun();


问题1: 对于普通函数,Fun2在代码里有几个副本?

是否是共用的? 因为都是用int去实例化!!1


如果不是同一种类型实例化,又该如何?

问题2:

对于 静态函数 Fun而言, 对于同一种类型有几个副本, 不同的类型又有几个?





------解决方案--------------------
楼主只要把相应的概念对普通的类理解透彻,然后再记住类模板实例化以后就变成普通的类,就应该能够推理出它们在类模板情况下的性质了。
------解决方案--------------------
引用:
Quote: 引用:

楼主只要把相应的概念对普通的类理解透彻,然后再记住类模板实例化以后就变成普通的类,就应该能够推理出它们在类模板情况下的性质了。




引用:
在用相同模板参数进行实例化时,如果函数足够简单,并且:在类定义内定义或有inline声明或编译器进行了优化,这时函数就是内联函数,会直接把代码插入到调用处,但取地址的话是同一个地址。如果函数不能内联,那就只有一个。

当用不同模板参数进行实例化时,每个实例生成一个“副本”。

静态成员函数与非静态成员函数都一样,事实上普通成员函数只是比静态成员函数多了一个隐含的参数——this。



参考 第15楼
http://bbs.****.net/topics/390485405?page=1#post-394797026

这个帖子,我简答的说一下,是一个单例类, 一个友元模版类, 模版类有getinstance函数, 

单例类的构造,拷贝等函数均是私有的。   

代码为:

模版类
template <class T> class  Singleton
{
protected:
    Singleton(){}
public:
    static T& Instance()
    {
        static T instance;
        return instance;
    }
};


目标单例类

class ExampleSingleton      //: public Singleton<ExampleSingleton>
 {
     // so that Singleton<ExampleSingleton> can access the 
     // protected constructor
     friend class Singleton<ExampleSingleton>;  //注意友原

 protected:
         ExampleSingleton(){}
 public:
     // This class's real functionalities
     void Write(){printf("Hello, World!");}
 };



Singleton<ExampleSingleton>::Instance().Write(); 
每一个使用Singleton<ExampleSingleton>的地方都可能会生成一个Instance()

因为Singleton<ExampleSingleton>和ExampleSingleton毫无关系;


这带颜色的文字,是一个网友说的, 我问其什么原因,其回答:



C++的静态变量或者静态函数,和模板一起,就会让单例模式失去作用,因为可以在每个实现的地方实例化模板;
那么静态变量或者静态函数,就会在同一个程序里有又多个版本,因为静态变量或者静态函数是内部连接的,同一程序可以出现多个同名变量或者函数假设这个程序分成N个部分编译,每一份都分别实例化模板的话,就会有N个单例的实例,关键是模板是使用时实例化的,除非预先实例化,并编译好模板,否则,就会出现多份的单例的实例。