2013-02-15 27 views
-2

“函数声明中使用模板关键字”的含义是什么?函数声明中模板关键字的含义

在这个例子中编译错误,错误:“func”不是模板函数。

template<typename T> 
struct Window { 
    T value; 
}; 

template void func(Window<int>, int); 

template<typename T> 
void func(Window<T>, T) { 
} 

int main(void) { 
} 

但是下面的例子没问题。

template<typename T> 
struct Window { 
    T value; 
}; 

template<typename T> 
void func(Window<T>, T) { 
} 

template void func(Window<int>, int); 

int main(void) { 
} 

在上述情况下,“template”是什么意思? 这个函数是模板函数吗?

+1

这些是您可以在任何教科书或教程中找到的基本概念。谷歌可以肯定地指出你很多。 – 2013-02-15 01:22:09

回答

0

一个声明以关键字template开头,紧接着没有<尖括号>称为显式实例化。它意味着查找模板定义并插入指定的模板参数以获得特定的功能专业化或类专业化。所以在第一个例子中,编译器抱怨它不能实例化func(Window<int>, int),因为它还不知道有关名为func的模板的任何信息。

显式实例化通常不是必需的,因为模板可以通过尝试使用它们而隐式实例化。但是明确的实例化可以控制链接器符号出现的位置和方式,并且在某些情况下可以用于将模板定义从头文件移出到源文件中。

+0

谢谢@aschepler的答案。当需要明确的instantiaiton时,你能举一些例子吗?你评论了一些情况,但我无法理解。 – 2013-02-15 05:45:07

+0

我明白了。如果模板函数或类位于单独的源文件中,则需要显式实例化。临时实例只有在被调用时才会发生。 http://msdn.microsoft.com/en-US/library/7k8twfx7(v=vs.80).aspx – 2013-02-15 09:02:58

0

这仅仅是因为你的第一个例子中,你所具有的选择由该行所代表的强制实例化后的模板

template<typename T> 
void func(Window<T>, T) { 
} 

的定义:

template void func(Window<int>, int); 

而在他们”第二个例子重新正确的方式。

但是,对您的问题的评论是公平的,您提出的是一个基本问题('模板意味着什么'),最好通过对该主题的深入研究来回答。