簡體   English   中英

通過轉換運算符調用顯式實例化的模板函數

[英]Call of explicitly instantiated template function through conversion operator

讓我們假設我們有一個函數模板,它在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() ,是否存在任何其他解決方案?

為什么不能只調用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

不可能調用function(a) ,因為那么T將是Data類型,而不是double ,即使它有轉換運算符。 並且因為您沒有在cpp文件中明確定義它,所以會出現鏈接器錯誤。

以下是您可以使用的一些解決方案:

//Call operator double() explicitly 
function(a.operator double());

//Specify T
function<double>(a);

//Casting
function(static_cast<double>(a));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM