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 version\n");
}
template<typename T>
void function(T val)
{
printf("value version\n");
}
int main()
{
std::vector<int> vec;
function(vec);
return 0;
}
每个环境我都试过了,终于搞定了
在 VC6,value 版本的功能,以及
在 VS2008 中,vector 版本的函数。
我有 2 个问题。
我已经认识到重载函数调用的优先级如下,
a) 专用函数(没有隐式类型转换)
b) 模板函数(没有隐式类型转换)
c) 专用函数,具有隐式类型 convert
d) 模板函数,带有隐式类型 convert
有了这个规则,上面的结果好像
在 VC6,b) 被接受( = std::vector)
在 VS2008 中,b) 被忽略(?)并且 d)被接受(?)( = int)
说明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)
这将推导出矢量版本。请注意 >
之间的 space,这是为了避免编译器认为您指的是流运算符 >>
.
希望对您有所帮助。
我有关于 Visual C++ 6.0 和 Visual Studio 2008 模板函数的简单代码。
#include <stdio.h>
#include <vector>
template<typename T>
void function(const std::vector<T> &vec)
{
printf("vector version\n");
}
template<typename T>
void function(T val)
{
printf("value version\n");
}
int main()
{
std::vector<int> vec;
function(vec);
return 0;
}
每个环境我都试过了,终于搞定了
在 VC6,value 版本的功能,以及
在 VS2008 中,vector 版本的函数。
我有 2 个问题。
我已经认识到重载函数调用的优先级如下,
a) 专用函数(没有隐式类型转换)
b) 模板函数(没有隐式类型转换)
c) 专用函数,具有隐式类型 convert
d) 模板函数,带有隐式类型 convert有了这个规则,上面的结果好像
在 VC6,b) 被接受(= std::vector )
在 VS2008 中,b) 被忽略(?)并且 d)被接受(?)(= int) 说明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)
这将推导出矢量版本。请注意 >
之间的 space,这是为了避免编译器认为您指的是流运算符 >>
.
希望对您有所帮助。