Nex*_*Nex 3 c++ templates linker-errors conversion-operator explicit-instantiation
让我们假设我们有一个函数模板,它在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(),是否存在任何其他解决方案?
为什么不能打电话
function(a)
?
它是.你在叫它.但请记住,function
声明为:
template<typename T> void function(T val);
Run Code Online (Sandbox Code Playgroud)
所以模板演绎将推断出来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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
166 次 |
最近记录: |