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

我有一个带有一个参数的模板函数。 我必须实例化那个函数而不调用那个函数意味着我必须显式地实例化。

我有这个功能:

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

我实例化了这个函数:

template int function_name<int>(int);

但我得到了以下错误:

error: expected primary-expression before 'template'
error: expected `;' before 'template'
102137 次浏览

[编辑2] : 注意,由于代码格式问题,关于原问题中的代码有一些混淆。更多细节见 Anthony Hatchkins 的回答。

如果你真的想实例化(而不是专门化或其他)函数,这样做:

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是一个模板参数。

当我们想要拆分 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