好吧,假设我有这样一个函数
template <typename T>
void Func(std::vector<T> x, T alpha = 1)
{
// ... do stuff
}
我想将它与复杂类型一起使用,就像这样
std::vector<std::complex<double>> x;
Func(x, 5.5);
然后编译器提示 (VS2010) template parameter 'T' is ambiguous
因为它could be 'double' or 'std::complex<double>'
.明显的修复,这样调用它
Func(x, std::complex<double>(5.5));
但是,那个,我不想要。为什么不能自动转为复杂类型?
最佳答案
它不起作用的原因是第一个参数导致 T
推导为std::complex<double>
而第二个参数导致它被推断为 double
.它在推导参数时根本不考虑转换。显然,这使得推论变得模棱两可。
您可以借助 identity
强制第二个参数类型不可推导助手:
template <typename T>
struct identity { typedef T type; };
template <typename T>
void Func(std::vector<T> x, typename identity<T>::type alpha = 1)
{
// ... do stuff
}
关于c++ - 模板功能的小烦恼,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15659119/