加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 通过转换运算符调用显式实例化的模板函数

发布时间:2020-12-16 10:02:46 所属栏目:百科 来源:网络整理
导读:让我们假设我们有一个函数模板,它在cpp文件中实现,借助显式实例化,如下所示: function.h templatetypename T void function(T val); function.cpp #include "function.h"templatetypename T void function(T val) { /* do something */ }template void func
让我们假设我们有一个函数模板,它在cpp文件中实现,借助显式实例化,如下所示:

function.h

template<typename T> void function(T val);

function.cpp

#include "function.h"

template<typename T> void function(T val) { /* do something */ }

template void function<double>(double val);

我们现在能够在包含function.h的主文件中调用该函数,如下所示:

double val = 1.0;

function(val);

让我们进一步假设我们有一个类如下所示:

data.h

class Data
    {
    private:
        double mVal;

    public:
        Data(double val) { mVal = val; }

        operator double () { return mVal; }
    };

以下代码导致链接器错误LNK2019:unresolved external(Visual Studio 2010):

Data a(1.0);

function(a);

我们可以使用以下表达式之一来提供一个to function()

function<double>(a);
function(double(a));
...

但为什么不能只调用函数(a)?如果没有使用类型Data显式实例化function(),是否存在任何其他解决方案?

解决方法

why is it not possible to just call function(a)?

它是.你在叫它.但请记住,该函数声明为:

template<typename T> void function(T val);

因此模板推导将推导出函数< Data>.模板推导不知道代码中的其他地方您只有函数的定义< double> – 它只是扣除.并且功能< Data>没有定义,因此无法链接.

在我看来,自己执行显式转换(函数< double>(a)或函数(static_cast< double>(a)))将是最好的解决方案.明确很好.您还可以使用实际支持的所有重载编写一个单独的函数,然后转发到函数模板:

void fwd_function(double v) { function(v); }
void fwd_function(foo v) { function(v); }
void fwd_function(bar v) { function(v); }

fwd_function(a); // now we call function<double> because fwd_function(double )
                 // is the what we're actually calling

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读