这是一个已知的 VC14 错误吗

Posted

技术标签:

【中文标题】这是一个已知的 VC14 错误吗【英文标题】:Is this a known VC14 bug 【发布时间】:2015-08-27 16:35:11 【问题描述】:

下面的代码给了我一个编译错误。

$ cl.exe VC14-bug.cpp

Microsoft (R) C/C++ 优化编译器版本 19.00.23026 for x64

版权所有 (C) Microsoft Corporation。保留所有权利。

VC14-bug.cpp

VC14-bug.cpp(41): error C2893: 无法专门化函数模板'void failed(T1,Poly> *)'

VC14-bug.cpp(41):注意:使用以下模板参数:

VC14-bug.cpp(41):注意:'T1=int'

VC14-bug.cpp(41):注意:'T2=Kernel'

函数 f() 有问题。任何人都可以复制它吗?

template <typename T>
struct Container
;


struct Kernel 
typedef int Nested;
;


template <class K,
          class C = Container<typename K::Nested*> >
struct Poly
;


// if f() gets commented it compiles
template<class T>
Poly<T>* 
f()
 
    return 0;



//template<class T2, class T1> // this compiles
template<class T1, class T2>
void
fails(T1, 
      Poly<T2> *)



// if f() is moved here it also compiles

int main()
  
    Poly<Kernel> * poly = 0;

    fails(0, poly);

    return 0;

【问题讨论】:

老实说,VC 错误报告的位置错误。 您确定这是一个错误,而不仅仅是 microsoft c++11 兼容性中缺少的功能吗?您是否尝试过明确指定失败的类型并查看它是否有效? 如果没有人可以重现它,它可能仍然是错误的代码。我也发在这里了:social.msdn.microsoft.com/Forums/vstudio/en-US/… 我找不到代码有什么问题,而且它在 Clang 和 GCC 上编译,所以我认为这是 MSVC 中的一个错误。报告Connect。 完成connect.microsoft.com/VisualStudio/feedback/details/1750871 【参考方案1】:

那肯定是VC14的模板参数推导代码的bug。

一种可能的解决方法是在fails 中允许Poly 的所有类型的容器:

template<class T1, class T2, class Cont>
void
fails(T1, 
      Poly<T2, Cont> *)

我已使用online Visual C++ compiler 进行了验证。不幸的是,无法链接到测试用例like what we would do on Ideone.com (click to see the compilation with g++-5.1)。

【讨论】:

以上是关于这是一个已知的 VC14 错误吗的主要内容,如果未能解决你的问题,请参考以下文章

VC++中运行C语言一个工程总可以运行多个代码吗?

MSVC 无法根据模板参数进行数学运算,这是一个错误吗?

opencv 安装 vc14可以在vs10上运行吗

这种“方法注入”的虚拟继承使用模式是一种已知的范例吗?

VC14(VC2015)安装失败,0x80240017 - 未指定的错误,解决办法

VC14(VC2015)安装失败,0x80240017 - 未指定的错误,解决办法