下面的代码给了我一个编译错误。
$ 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)。