c – 通过转换运算符调用显式实例化的模板函数
让我们假设我们有一个函数模板,它在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(),是否存在任何其他解决方案? 解决方法
它是.你在叫它.但请记住,该函数声明为: template<typename T> void function(T val); 因此模板推导将推导出函数< Data>.模板推导不知道代码中的其他地方您只有函数的定义< double> – 它只是扣除.并且功能< Data>没有定义,因此无法链接. 在我看来,自己执行显式转换(函数< double>(a)或函数(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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- oracle插入字符串数据时字符串中有'单引号问题
- 函数’enterChar’的隐式声明[-Wimplicit-function-
- 新内核2.6.30编译完之后在目标板上看不到ttyS1
- swift – TableView细胞分离器线不会在整个细胞中延伸
- swift – iOS8自定义键盘 – 复制并粘贴到UIPasteboard
- 在flash builder中为swc 关联源码
- 28、swift开发iOS——类型转换
- C语言中 int main(int argc,char *argv[])的两个参数详解
- TinyXML笔记-1
- rapidxml读取utf-8 格式xml乱码问题(utf-8格式转GBK)