参考

2016-09-14 59 views
1

我得到了以下运行参考

using namespace std; 
#include <iostream> 

template<typename a> struct function 
{ 
    void self1(){ cout << "hello world 1111" << endl; } 
}; 

template<typename a> struct function<a&> 
{ 
    void self2() { cout << "hello world 2222" << endl; } 
}; 


int main() 
{ 
    function<int> a; 
    a.self1(); 
    function<int&> b; 
    b.self2(); 
    return 0; 
} 

结果代码:

hellow world 1111 
heloow world 2222 

想问的第一个“结构功能”,第二个“结构之间的关系船功能“

第二个被分类为第一个”模板专业化“吗? (似乎不是)

我可以看到,第二个是基于第一个。 (通过删除第一个,它是不可编译的)。但是

b.self1() is not defined. 

因此,不知何故第二次重新定义了结构到一个新的?

+0

是的,这是模板专业化。 –

+0

@GillBates Thx,我通常的理解是模板专门化会定义类型为bool/int等等。现在它被定义为一个参考。我会更深入地了解这些知识。 – thundium

回答

1

我可以看到,第二个是基于第一个。 (通过删除 第一个,它不是可编译的)。但是

b.self1()未定义。所以第二个已经重新定义了结构 到一个新的?

function是一个结构模板,它不是一个结构本身。在实例化一个像你这样做的时刻:function<int> a;编译器生成一个struct function_int,其中包含所有T's(或a's在这种情况下)的int

template<typename a> struct function<a&> 

这是结构模板的一个特例,这些会用来为当a是引用类型。这种专业化不能使用“原始”结构模板的任何成员/方法。

+0

这是什么意思,专业化分享什么与主要模板?这是一种专门化,如果主模板不存在,它将不会编译。这不够吗? – skypjack

+0

@Sypypjack因为你不能在这个专长中使用'self1()'。 –

+0

我明白你的观点。那么,实际上_没有什么不是说这种最好的方式。我的两分钱。 :-) – skypjack