如何显式实例化模板函数?


117

我有一个带有一个参数的模板函数。我必须实例化该函数而不调用该函数,这意味着我必须实例化。

我有这个功能:

template <class T> int function_name(T a) {}

我实例化了这样的功能:

template int function_name<int>(int);

但是我遇到了以下错误:

error: expected primary-expression before 'template'
error: expected `;' before 'template'

Answers:


182

[编辑2]:请注意,由于代码格式问题,原始问题中的代码有些混乱。有关更多详细信息,请参见AnthonyHatchkins的答案。

如果您真的想实例化(而不是专门化)功能,请执行以下操作:

template <typename T> void func(T param) {} // definition

template void func<int>(int param); // explicit instantiation.

[编辑]在显式实例化和专门化方面似乎(很多)混乱。我上面发布的代码涉及显式实例化专业化的语法不同。这是专门化的语法:

template <typename T> void func(T param) {} // definition

template <> void func<int>(int param) {} // specialization

注意模板后的尖括号!


3
实例化还是专业化
Nawaz

5
不对。您可以告诉编译器显式实例化模板。Google提供了“ C ++显式模板实例化”的更多信息。
hrnt 2011年

8
@Nawaz:你错了。当然,实例总是由编译器实例化的,该行是程序员对编译器实例化模板的请求。如果你有C ++标准的副本,读14.7.2显式实例
大卫·罗德里格斯- dribeas

16
专业化意味着您可能正在更改其实现。实例化只是意味着您将其分配给特定的编译单元,可能采用其唯一地址或使其用作库函数或减少膨胀。
CashCow 2011年

3
@hrnt:我认为,你是对的。@Ashot:我只是注意到语法没有template<>形式。他所写的与专业不同。+1教我这个新事物。我要删除我的帖子。:D
纳瓦兹

20

您的代码是正确的。

错误消息与您在此处未引用的代码中的位置有关。

更新:

原代码为

template <class T> int function_name(T a) {}
template int function_name<int>(int);

这是正确的。

但是它没有被引用,因此看起来像这样:

template int function_name(T a) {}
template int function_name(int);

它产生以下错误

a.cpp:1: error: explicit instantiation of non-template int function_name
a.cpp:1: error: expected `;' before ‘(’ token
a.cpp:3: error: function_name is not a template function

这与OP所引用的明显不同。

在此变体中,第二行没问题(<int>此处可以省略),但是第一行有故障。编译器无法猜测这T是模板参数。


从技术上讲这不是他的代码,这是比尔的编辑:)原代码是template int function_name( T a) { }template int function_name(int);
hrnt

@hrnt原始代码格式不正确,但是正确。如果我是巴拉吉(Balaji),如果他认为有用,我会返回并接受您的回答,但对我(可能对其他任何人)您的回答(虽然完全正确)本身并不能回答问题。
2014年

@hrnt是正确的,原始代码看起来像那样。但是由于推导了模板参数,它仍然有效。我必须同意安东尼·哈奇金斯(Antony Hatchkins)的观点,该错误是由OP未引用的代码引起的,但是我认为您的答案对于不了解显式实例化的人仍然有用。
mpark

好吧,以我为例。当我想刷新有关显式实例化的众所周知的知识时,我在此页面上进行了搜索-并没有太大帮助。对我来说,语法没有混淆。关于显式实例化可能引起混淆的是它的用法
Antony Hatchkins 2014年

@AntonyHatchkins啊,是的-我没有看原始问题的源头,而是它在屏幕上的显示方式。我将为此+1,并修改我的原始答案,以注意对原始问题的困惑。
hrnt 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.