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

时间:2015-11-25 13:43:49

标签: c++ visual-studio templates vc6

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

我有两个问题。

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

    按照这条规则,上述结果似乎是 在VC6,b)被接受(&lt; T&gt; = std :: vector&lt; int&gt;)
    在VS2008,b)被忽略(?)并且d)被接受(?)(&lt; T&gt; = int)

    这意味着VC6有效且VS2008错误 我的猜测不正确吗?

  2. 虽然,我希望VC6和VS2008都能调用矢量版本 我能这样做吗?

  3. 问候。

1 个答案:

答案 0 :(得分:0)

实际上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),那么将调用value函数,因为您传入了一个引用,该引用被推导为function<std::vector<int>>(vec)

如果你想让它总是调用正确的函数,那么你需要明确,所以你需要这样调用它:

function< std::vector<int> >(vec)

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

希望有所帮助。