ChatGPT解决这个技术问题 Extra ChatGPT

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

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

我有这个功能:

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

我像这样实例化该函数:

template int function_name<int>(int);

但我收到以下错误:

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

h
hrnt

[编辑 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

注意模板后面的尖括号!


那是实例化还是专业化?
不对。您可以告诉编译器显式实例化模板。谷歌“C++显式模板实例化”了解更多细节。
@Nawaz:你错了。当然,实例化始终是编译器,该行是程序员对编译器的实例化模板的请求。如果您有 C++ 标准的副本,请阅读 14.7.2 显式实例化
专业化意味着您可能正在更改其实现。实例化只是意味着您将其分配给特定的编译单元,可能是为了获取它的唯一地址或使其作为库函数可用或减少膨胀。
@hrnt:我想,你是对的。 @Ashot:我刚刚注意到语法没有 template<> 形式。他写的和specialization不同。 +1 教我这个新东西。我正在删除我的帖子。 :D
A
Antony Hatchkins

你的代码是正确的。

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

更新:

原始代码是

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 原始代码的格式不正确,但它是正确的。如果我是巴拉吉(Balaji),如果他认为有用,我会返回并接受您的回答,但是对我(可能对其他任何人)而言,您的回答(虽然本身完全正确)并不能回答问题。
@hrnt您说得对,原始代码看起来像那样。但是由于推导出的模板参数它仍然有效。我必须同意 Antony Hatchkins 的观点,即错误是由 OP 未引用的代码引起的,但是我认为您的答案对于不了解显式实例化的人仍然有用。
好吧,拿我来说吧。当我想刷新我被遗忘的关于显式实例化的知识时,我用谷歌搜索了这个页面——它对我没有多大帮助。至于我,语法没有混淆。显式实例化可能导致混淆的是它的用法
@AntonyHatchkins 啊,真的-我没有看原始问题的来源,只是看它是如何出现在我的屏幕上的。我将对此 +1 并修改我原来的答案,以注意对原始问题的混淆。
G
Gelldur

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