今天无意间发现一段模板函数代码,用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关键字,仍然失败,有兴趣的大佬可以试试。
欢迎交流与讨论,不知道有没有更好的解决办法。