通过转换运算符调用显式实例化的模板函数
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);
让我们进一步假设我们有一个 class 是这样实现的:
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);
我们可以使用以下表达式之一将 a 提供给 function()
function<double>(a);
function(double(a));
...
但为什么不能只调用 function(a)?是否存在任何其他解决方案来实现这一点而无需显式实例化 function() 类型 Data?
why is it not possible to just call function(a)
?
是的。你在呼唤它。但请记住 function
声明为:
template<typename T> void function(T val);
因此模板推导将推导 function<Data>
。模板推导不知道代码中的其他地方您只有 function<double>
的定义 - 它只是进行推导。而 function<Data>
没有定义,所以它无法 link.
自己执行显式转换(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));
让我们假设我们有一个函数模板,它是在 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);
让我们进一步假设我们有一个 class 是这样实现的:
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);
我们可以使用以下表达式之一将 a 提供给 function()
function<double>(a);
function(double(a));
...
但为什么不能只调用 function(a)?是否存在任何其他解决方案来实现这一点而无需显式实例化 function() 类型 Data?
why is it not possible to just call
function(a)
?
是的。你在呼唤它。但请记住 function
声明为:
template<typename T> void function(T val);
因此模板推导将推导 function<Data>
。模板推导不知道代码中的其他地方您只有 function<double>
的定义 - 它只是进行推导。而 function<Data>
没有定义,所以它无法 link.
自己执行显式转换(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));