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

Bal*_*aji 110 c++ templates

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

我有这个功能:

template <class T> int function_name(T a) {}
Run Code Online (Sandbox Code Playgroud)

我实例化了这样的函数:

template int function_name<int>(int);
Run Code Online (Sandbox Code Playgroud)

但是我遇到了以下错误:

error: expected primary-expression before 'template'
error: expected `;' before 'template'
Run Code Online (Sandbox Code Playgroud)

hrn*_*rnt 172

[编辑2]:请注意,由于代码格式问题,原始问题中的代码存在一些混淆.有关详细信息,请参阅AnthonyHatchkins的回答.

如果你真的想要实例化(而不是specialize或其他)函数,请执行以下操作:

template <typename T> void func(T param) {} // definition

template void func<int>(int param); // explicit instantiation.
Run Code Online (Sandbox Code Playgroud)

[编辑]关于显式实例化和专业化似乎存在(很多)混淆.我上面发布的代码处理显式实例化.专业化的语法是不同的.以下是专业化的语法:

template <typename T> void func(T param) {} // definition

template <> void func<int>(int param) {} // specialization
Run Code Online (Sandbox Code Playgroud)

注意模板后的尖括号!

  • 专业化意味着您可能正在改变其实施.实例化只是意味着您将其分配给特定的编译单元,可能采用其唯一的地址或使其可用作库函数或减少膨胀. (15认同)
  • @Nawaz:你错了.当然,编译器始终是实例化的,该行是程序员向编译器实例化模板的请求.如果您有C++标准的副本,请阅读**14.7.2显式实例化** (8认同)
  • 不对.您可以告诉编译器显式实例化模板.Google提供了"C++显式模板实例化"以获取更多详细信息. (5认同)
  • @hrnt:我想,你是对的.@Ashot:我刚注意到语法没有`template <>`形式.他所写的不同于*专业化*.+1教我这个新东西.我正在删除我的帖子.:d (3认同)
  • 那是*instantiation*或*specialization*? (2认同)
  • @Nawaz:不是真的。您不需要调用该函数 - 只需显式实例化就足够了。亲自查看 - 显式实例化一个函数并查看生成的目标文件。 (2认同)

Ant*_*ins 20

你的代码是正确的.

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

更新:

原始代码是

template <class T> int function_name(T a) {}
template int function_name<int>(int);
Run Code Online (Sandbox Code Playgroud)

这是正确的.

但它没有被引用,因此看起来像这样:

template int function_name(T a) {}
template int function_name(int);
Run Code Online (Sandbox Code Playgroud)

它会生成以下错误

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
Run Code Online (Sandbox Code Playgroud)

这与OP引用的明显不同.

在这个变体中第二行是ok(<int>这里可以省略),但第一行是错误的.编译器无法猜测这T是一个模板参数.


Daw*_*ozd 9

当我们想要分割cpp/hpp文件时,这可能对实例化模板方法有帮助。

// foo.hpp

struct Foo
{
    template<typename T>
    void myMethod(T var);
};

Run Code Online (Sandbox Code Playgroud)
// 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;
}
Run Code Online (Sandbox Code Playgroud)

例子:

    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
Run Code Online (Sandbox Code Playgroud)
OUT:
i - 1
d - 2
Run Code Online (Sandbox Code Playgroud)

您可以在这里播放: https: //onlinegdb.com/gwAjMF9QH