C++ 如何显式实例化模板函数?
我有一个带一个参数的模板函数。 我必须实例化该函数,而不调用该函数意味着我必须显式地实例化 我有这个功能:C++ 如何显式实例化模板函数?,c++,templates,C++,Templates,我有一个带一个参数的模板函数。 我必须实例化该函数,而不调用该函数意味着我必须显式地实例化 我有这个功能: template <class T> int function_name(T a) {} [编辑2]:注意,由于代码格式问题,原始问题中的代码存在一些混淆。更多细节请参见AnthonyHatchkins的答案 如果确实要实例化(而不是专门化或其他)函数,请执行以下操作: template <typename T> void func(T param) {} //
template <class T> int function_name(T a) {}
[编辑2]:注意,由于代码格式问题,原始问题中的代码存在一些混淆。更多细节请参见AnthonyHatchkins的答案 如果确实要实例化(而不是专门化或其他)函数,请执行以下操作:
template <typename T> void func(T param) {} // definition
template void func<int>(int param); // explicit instantiation.
template void func(T参数){}//定义
模板void func(int参数);//显式实例化。
[编辑]关于显式实例化和专门化,似乎存在(很多)混淆。
我上面发布的代码处理显式实例化。专门化的语法是不同的。
以下是专门化的语法:
template <typename T> void func(T param) {} // definition
template <> void func<int>(int param) {} // specialization
template void func(T参数){}//定义
模板void func(int参数){}//专门化
注意模板后面的尖括号 您的代码是正确的
错误消息与代码中的某个位置有关,您在此处没有引用该位置
更新:
原始代码是
template <class T> int function_name(T a) {}
template int function_name<int>(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所引用的明显不同
在此变体中,第二行正常(此处可省略),但第一行有故障。编译器无法猜测
T
是一个模板参数。这可能有助于在拆分cpp/hpp文件时实例化模板方法
// foo.hpp
struct Foo
{
template<typename T>
void myMethod(T var);
};
您可以在这里播放:这是实例化还是专门化?不是真的。您可以告诉编译器显式实例化模板。谷歌搜索“C++显式模板实例化”了解更多详细信息。@Nawaz:你错了。当然,实例化的总是编译器,这一行是程序员向编译器发出的实例化模板的请求。如果你有C++标准的拷贝,读7.7.2显式实例化专业化意味着你可能正在改变它的实现。实例化只是指将其分配给特定的编译单元,可能是为了获取其唯一地址,或使其作为库函数可用,或是为了减少膨胀。@hrnt:我想你是对的@Ashot:我刚刚注意到语法没有
模板
表单。他所写的与专业化不同+谢谢你教我这个新东西。我要撤职了技术上这不是他的代码,而是比尔的编辑:)原始代码是template int function_name(ta){}
和template int function_name(int)
@hrnt原始代码的格式不正确,但它是正确的。如果我是Balaji,如果他认为你的答案有用,我会返回并接受你的答案,但对我来说(大概对其他人来说),你的答案(虽然本身完全正确)并不能回答这个问题。@hrnt你是对的,原来的代码是这样的。但由于推导出的模板参数,它仍然有效。我必须同意Antony Hatchkins的观点,即错误源于OP没有引用的代码,但是我认为您的答案对于不知道显式实例化的人仍然有用。好吧,以我为例。当我想刷新我早已忘记的关于显式实例化的知识时,我在谷歌上搜索了这个页面,但这对我帮助不大。至于我,语法上没有任何混乱。可能导致显式实例化混淆的是它的usage@AntonyHatchkins啊,没错——我没有看原始问题的来源,只是看它是如何出现在我的屏幕上的。我将+1这一点,并修改我的原始答案,以注意关于原始问题的混淆。
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
// foo.hpp
struct Foo
{
template<typename T>
void myMethod(T var);
};
// foo.cpp
#include <typeinfo>
#include <iostream>
template void Foo::myMethod(int var);
template void Foo::myMethod(double var);
template <typename T>
void Foo::myMethod(T var)
{
std::cout << typeid(T).name() << " - " << var << std::endl;
}
Foo foo;
foo.myMethod(1);
foo.myMethod(2.0);
// undefined reference to `void Foo::myMethod(float)'
// foo.myMethod(2.0F); <-- doesn't work as we don't have definition
OUT:
i - 1
d - 2