[编辑 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
注意模板后面的尖括号!
你的代码是正确的。
错误消息与您在此处未引用的代码中的位置有关。
更新:
原始代码是
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);
当我们想要拆分 cpp/hpp 文件时,这可能有助于实例化模板方法。
// 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
您可以在此处播放:https://onlinegdb.com/gwAjMF9QH
不定期副业成功案例分享
template<>
形式。他写的和specialization不同。 +1 教我这个新东西。我正在删除我的帖子。 :D