VC6 和 VS2008 之间的模板函数行为

template function behavor between VC6 and VS2008

本文关键字:函数 VS2008 之间 VC6      更新时间:2023-10-16

我有关于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,矢量版本的功能。

我有两个问题。

  1. 我已经认识到重载函数调用的优先级如下,
    a( 专用函数(无隐式类型转换(
    b( 模板函数(无隐式类型转换(
    c( 专用函数,隐式类型转换
    d( 模板函数,隐式类型转换

    有了这个规则,上面的结果似乎
    在VC6中,b(被接受( = std::vector(
    在VS2008中,b(被忽略(?(,d(被接受(?((带 = 整数(

    这意味着VC6是有效的,而VS2008是错误的。
    我的猜测不正确吗?

  2. 虽然,我希望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)

这将推断出矢量版本。注意>之间的空格,这是为了避免编译器认为你的意思是流算子>>

希望有帮助。