VC6 和 VS2008 之间的模板函数行为
template function behavor between VC6 and VS2008
我有关于Visual C++ 6.0和Visual Studio 2008模板函数的简单代码。
#include <stdio.h>
#include <vector>
template<typename T>
void function(const std::vector<T> &vec)
{
printf("vector versionn");
}
template<typename T>
void function(T val)
{
printf("value versionn");
}
int main()
{
std::vector<int> vec;
function(vec);
return 0;
}
我尝试了每种环境,最终得到
在VC6,值版本的函数,以及
在VS2008,矢量版本的功能。
我有两个问题。
我已经认识到重载函数调用的优先级如下,
a( 专用函数(无隐式类型转换(
b( 模板函数(无隐式类型转换(
c( 专用函数,隐式类型转换
d( 模板函数,隐式类型转换有了这个规则,上面的结果似乎
在VC6中,b(被接受(= std::vector (
在VS2008中,b(被忽略(?(,d(被接受(?((带= 整数( 这意味着VC6是有效的,而VS2008是错误的。
我的猜测不正确吗?虽然,我希望VC6和VS2008都需要矢量版本。
我能做到吗?
问候。
实际上 VC6 是错误的;MS 在 VC6 中对 C++99 标准(这是模板标准化时(的支持有限,而在 VS2005 及更高版本中有更好的支持。
呼叫function(vec)
呼叫
template<typename T>
void function(const std::template vector<T>& vec)
将T
作为int
类型,因为模板是从矢量模板类型推导出来的(与调用function<int>(vec)
相同(。如果您调用了function(&vec)
则将调用值函数,因为您正在传递一个引用,该引用被推导出为 function<std::vector<int>>(vec)
。
如果您希望它始终调用正确的函数,则需要显式,因此您需要这样调用它:
function< std::vector<int> >(vec)
这将推断出矢量版本。注意>
之间的空格,这是为了避免编译器认为你的意思是流算子>>
。
希望有帮助。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- VS2008 SP1:将一对推入矢量时没有合适的默认构造函数可用
- std::tr1::函数为VS2008 SP1中的x64配置提供链接错误
- VC6 和 VS2008 之间的模板函数行为
- VS2008调试WEC7应用程序-断点目前不会被击中.此函数当前没有加载可执行代码
- VS2008|:任务管理器和CRT堆调试器函数之间的内存使用差异
- VS2008 c++调试器似乎无法/不愿意查看函数中定义的结构的内部实例.人们是如何调试这些代码的?
- 导出函数的默认调用约定是什么(VS2008)