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

Posted

技术标签:

【中文标题】VC6 和 VS2008 之间的模板函数行为【英文标题】:template function behavor between VC6 and VS2008 【发布时间】:2015-11-25 13:43:49 【问题描述】:

我有关于 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) 具有隐式类型转换的专用函数 d) 模板函数,隐式类型转换

    有了这条规则,上面的结果似乎是 在 VC6 中,b) 被接受(使用 = std::vector) 在 VS2008 中,b) 被忽略(?) 并且 d) 被接受(?) (with = int)

    这说明VC6有效,VS2008错误。 我的猜测不正确吗?

    虽然,我希望 VC6 和 VS2008 都调用矢量版本。 我可以吗?

问候。

【问题讨论】:

【参考方案1】:

其实VC6是错的; MS 在 VC6 中对 C++99 标准(模板标准化时)的支持有限,在 VS2005 及更高版本中支持更好。

打电话给function(vec)打电话

template<typename T>
void function(const std::template vector<T>& vec)

T 用作int 类型,因为模板是从向量模板类型推导出来的(与调用function&lt;int&gt;(vec) 相同)。如果你调用了function(&amp;vec),那么值函数将被调用,因为你传入了一个引用,它被推导出为function&lt;std::vector&lt;int&gt;&gt;(vec)

如果您希望它始终调用正确的函数,那么您需要明确,因此您需要这样调用它:

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

这将推导出矢量版本。注意&gt; 之间的空格,这是为了避免编译器认为您的意思是流运算符&gt;&gt;

希望对您有所帮助。

【讨论】:

非常感谢。但是,不幸的是,我的任务是维护库代码(这意味着我无法更改调用方)。我尝试另一种方式。 啊!了解这是怎么回事!

以上是关于VC6 和 VS2008 之间的模板函数行为的主要内容,如果未能解决你的问题,请参考以下文章

VS2008 exe-VC6 dll互操作性

VC6.0中怎样使用CImage类?

泛函编程—模板函数_类模板

vs2013的语言库与vc++的语言库的不同都有哪些?

问题:工程迁移 VC6->VS2008->VS2010

具有右值引用参数的模板赋值运算符与 vs2013 和 gcc 的行为不同