小编Nex*_*Nex的帖子

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

让我们假设我们有一个函数模板,它在cpp文件中实现,并提供了明确的实例化,如下所示:

function.h

template<typename T> void function(T val);
Run Code Online (Sandbox Code Playgroud)

function.cpp

#include "function.h"

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

template void function<double>(double val);
Run Code Online (Sandbox Code Playgroud)

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

double val = 1.0;

function(val);
Run Code Online (Sandbox Code Playgroud)

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

data.h

class Data
    {
    private:
        double mVal;

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

        operator double () { return mVal; }
    };
Run Code Online (Sandbox Code Playgroud)

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

Data a(1.0);

function(a);
Run Code Online (Sandbox Code Playgroud)

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

function<double>(a);
function(double(a));
...
Run Code Online (Sandbox Code Playgroud)

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

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

3
推荐指数
1
解决办法
166
查看次数