Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过转换运算符调用显式实例化的模板函数_C++_Templates_Linker Errors_Conversion Operator_Explicit Instantiation - Fatal编程技术网

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

C++ 通过转换运算符调用显式实例化的模板函数,c++,templates,linker-errors,conversion-operator,explicit-instantiation,C++,Templates,Linker Errors,Conversion Operator,Explicit Instantiation,假设我们有一个函数模板,它在cpp文件中通过显式实例化实现,如下所示: double val = 1.0; function(val); 函数.h 让我们进一步假设我们有一个类,它是这样实现的: double val = 1.0; function(val); 数据.h 以下代码导致链接器错误LNK2019:未解析的外部(Visual Studio 2010): 我们可以使用以下表达式之一提供to函数() 功能(a); 功能(双(a)); ... 但为什么不可能只调用函数(a)?有没有

假设我们有一个函数模板,它在cpp文件中通过显式实例化实现,如下所示:

double val = 1.0;

function(val);
函数.h

让我们进一步假设我们有一个类,它是这样实现的:

double val = 1.0;

function(val);
数据.h

以下代码导致链接器错误LNK2019:未解析的外部(Visual Studio 2010):

我们可以使用以下表达式之一提供to函数()

功能(a);
功能(双(a));
...
但为什么不可能只调用函数(a)?有没有其他解决方案可以在不使用类型数据显式实例化function()的情况下实现这一点

为什么不能直接调用
函数(a)

是的。你说得对。但请记住,
函数
声明为:

template<typename T> void function(T val);
模板无效函数(T val);
因此,模板推断将推断出
函数
。模板推断不知道代码中的其他地方只有
函数的定义
——它只是进行推断。而
函数
没有定义,因此无法链接

在我看来,自己执行显式转换(无论是
函数(a)
还是
函数(静态转换(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
void fwd_函数(双v){函数(v);}
void fwd_函数(foo v){函数(v);}
void fwd_函数(bar v){函数(v);}
fwd_函数(a);//现在我们调用函数,因为fwd_函数(double)
//这就是我们所说的

不可能调用
函数(a)
,因为
T
将是
数据类型
,而不是
双精度
,即使它具有该转换运算符。由于没有在
cpp
文件中显式定义它,因此会出现链接器错误

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

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

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

//Casting
function(static_cast<double>(a));
//显式调用运算符double()
函数(a.运算符double());
//指定T
职能(a);
//铸造
函数(静态_cast(a));

那么您希望程序的意义取决于您已经编写了多少程序?如果其他TU稍后实例化了
函数
,您希望这会神奇地影响已经编译好的TU中的重载解析?这确实是一个很好的观点。我没有想到在function.cpp之外实例化function()的可能性。
function<double>(a);
function(double(a));
...
template<typename T> void function(T val);
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
//Call operator double() explicitly 
function(a.operator double());

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

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