Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何显式实例化模板函数?_C++_Templates - Fatal编程技术网

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

C++ 如何显式实例化模板函数?,c++,templates,C++,Templates,我有一个带一个参数的模板函数。 我必须实例化该函数,而不调用该函数意味着我必须显式地实例化 我有这个功能: template <class T> int function_name(T a) {} [编辑2]:注意,由于代码格式问题,原始问题中的代码存在一些混淆。更多细节请参见AnthonyHatchkins的答案 如果确实要实例化(而不是专门化或其他)函数,请执行以下操作: template <typename T> void func(T param) {} //

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

我有这个功能:

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

[编辑2]:注意,由于代码格式问题,原始问题中的代码存在一些混淆。更多细节请参见AnthonyHatchkins的答案

如果确实要实例化(而不是专门化或其他)函数,请执行以下操作:

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

template void func<int>(int param); // explicit instantiation.
template void func(T参数){}//定义
模板void func(int参数);//显式实例化。
[编辑]关于显式实例化和专门化,似乎存在(很多)混淆。 我上面发布的代码处理显式实例化。专门化的语法是不同的。 以下是专门化的语法:

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

template <> void func<int>(int param) {} // specialization
template void func(T参数){}//定义
模板void func(int参数){}//专门化
注意模板后面的尖括号

您的代码是正确的

错误消息与代码中的某个位置有关,您在此处没有引用该位置

更新:

原始代码是

template <class T> int function_name(T a) {}
template int function_name<int>(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所引用的明显不同


在此变体中,第二行正常(此处可省略),但第一行有故障。编译器无法猜测
T
是一个模板参数。

这可能有助于在拆分cpp/hpp文件时实例化模板方法

// foo.hpp

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


您可以在这里播放:

这是实例化还是专门化?不是真的。您可以告诉编译器显式实例化模板。谷歌搜索“C++显式模板实例化”了解更多详细信息。@Nawaz:你错了。当然,实例化的总是编译器,这一行是程序员向编译器发出的实例化模板的请求。如果你有C++标准的拷贝,读7.7.2显式实例化专业化意味着你可能正在改变它的实现。实例化只是指将其分配给特定的编译单元,可能是为了获取其唯一地址,或使其作为库函数可用,或是为了减少膨胀。@hrnt:我想你是对的@Ashot:我刚刚注意到语法没有
模板
表单。他所写的与专业化不同+谢谢你教我这个新东西。我要撤职了技术上这不是他的代码,而是比尔的编辑:)原始代码是
template int function_name(ta){}
template int function_name(int)
@hrnt原始代码的格式不正确,但它是正确的。如果我是Balaji,如果他认为你的答案有用,我会返回并接受你的答案,但对我来说(大概对其他人来说),你的答案(虽然本身完全正确)并不能回答这个问题。@hrnt你是对的,原来的代码是这样的。但由于推导出的模板参数,它仍然有效。我必须同意Antony Hatchkins的观点,即错误源于OP没有引用的代码,但是我认为您的答案对于不知道显式实例化的人仍然有用。好吧,以我为例。当我想刷新我早已忘记的关于显式实例化的知识时,我在谷歌上搜索了这个页面,但这对我帮助不大。至于我,语法上没有任何混乱。可能导致显式实例化混淆的是它的usage@AntonyHatchkins啊,没错——我没有看原始问题的来源,只是看它是如何出现在我的屏幕上的。我将+1这一点,并修改我的原始答案,以注意关于原始问题的混淆。
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
// 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