同一段模板代码vs2008无法编译而10以及以上可以正确编译

文章讨论了一段模板函数在VisualStudio2008和2010及以上版本中的不同编译行为。VS2008在特定情况下无法正确展开模板,而VS2010及以后的版本没有问题。问题源于指针匹配失败,可能由于旧编译器的模板匹配机制。解决方案是对老编译器做特殊处理,或者避免使用模板展开。文章提供了示例代码并邀请读者交流讨论可能的优化方法。
摘要由CSDN通过智能技术生成

今天无意间发现一段模板函数代码,用vs2008无法正确展开,而vs2010以及以上可以正确展开,这里之所以说展开是因为这段模板本身并没有问题,但是如果调用模板“不合适”,则vs2008无法正确展开模板,而10以及以上没问题。

直接上代码(已经去掉无关代码),展开失败的原因是因为指针匹配失败,猜测是老编译器对于指针的模板匹配偏弱造成的,解决方法我在注释中著名了,针对老编译器不处理即可,确实需要相关功能的函数可以自行编写,而不要使用模板展开。

顺便说一句之所以使用vs2008也是老项目维护必须,所以emmm....

#include <iostream>
#include <vector>

using namespace std;

template <typename T>
void ColorObjects(const std::vector<T*>& vObjects, int nColor /*= 2*/)
{
	for (auto s = vObjects.begin(); s != vObjects.end(); ++s)
	{
		;
	}
}

std::vector<int*> CreateColorCurveFromEdge(const std::vector<int*>& ivpEdges, int nColor /*= 2*/)
{
	std::vector<int*> vCurveDst = std::vector<int*>();

//#if _MSC_VER > 1500
	ColorObjects(vCurveDst, nColor);
//#endif

	return vCurveDst;
}

int main(int argc, char **argv)
{
	return 0;
}

下面是vs2008的编译截图,出错位置如图所示:

 下面是vs2010的正确编译截图,同一个代码文件,没有任何修改。

我尝试不使用auto关键字,仍然失败,有兴趣的大佬可以试试。

 欢迎交流与讨论,不知道有没有更好的解决办法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值