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

标签 c++ templates linker-errors conversion-operator explicit-instantiation

让我们假设我们有一个函数模板,它是在 cpp 文件中借助于显式实例化实现的,如下所示:

函数.h

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

函数.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:未解析的外部 (Visual Studio 2010):

Data a(1.0);

function(a);

我们可以使用以下表达式之一将 a 提供给 function()

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

但为什么不能只调用function(a)?是否存在任何其他解决方案来实现该目标而无需显式实例化具有数据类型的 function()

最佳答案

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

是的。你在呼唤它。但请记住 function声明为:

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

所以模板推导将推导function<Data> .模板推导不知道在代码的其他地方您只有 function<double> 的定义。 - 它只是进行演绎。和 function<Data>没有定义,因此无法链接。

在我看来,自己执行显式转换(function<double>(a)function(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

关于c++ - 通过转换运算符调用显式实例化的模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37329503/

相关文章:

c++ - 将节点旋转到 BST 的根

c++ - 为什么 C++ 模板接受数组并不比一个接受指针 (bis) 更专业?

c++ - 在 linux 中获取两个 .so 文件之间的链接器错误

c++ - 模板实例化检查类中是否存在成员

c++ - ifstream/ofstream真的是用来序列化的吗?

c++ - 使用自定义分配器计算内存使用情况

C++ 相关名称 : Is this typename required?

c++ - 如何将类方法作为参数传递给另一个函数并稍后调用它,最好使变量类方法签名显式?

c++ - 如何消除程序中的链接器错误?

java - 在 S60 模拟器上部署应用程序时出现 LinkageError : bad major version at offset=6,