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


  $ cl.exe VC14-bug.cpp
  
  适用于x64的Microsoft(R)C / C ++优化编译器版本19.00.23026
  
  版权所有(C)Microsoft Corporation。版权所有。
  
  VC14-bug.cpp
  
  VC14-bug.cpp(41):错误C2893:无法专用于功能模板'void fail(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;
}

最佳答案

这肯定是VC14模板参数推导代码中的错误。

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

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)

09-12 04:40