繁体   English   中英

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

[英]How do I explicitly instantiate a template function?

我有一个带一个参数的模板函数。 我必须在不调用该函数的情况下实例化该函数,这意味着我必须明确实例化。

我有这个功能:

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

我像这样实例化了这个函数:

template int function_name<int>(int);

但我收到以下错误:

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

[编辑 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是模板参数。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM