c++ - 模板功能的小烦恼

标签 c++ templates

好吧,假设我有这样一个函数

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/

相关文章:

c++ - 使用类模板参数比使用实例变量有什么好处?

templates - Iron-Router 模板内的上下文

django - 无法导入名称TEMPLATE_CONTEXT_PROCESSORS

c++ - 我可以抽象出有关模板类的具体细节吗?

c++ - 获取 C++ 函数的大小

c++ - 在 Mac OSX 中以编程方式阻止屏幕保护程序

c++ - 编译器不创建模板化的 ostream << 运算符

c++ - 无法在 Qt 6.3 中加载 Qt5Compat.GraphicalEffects 模块

c++ - 具有类型推导的构造函数中的通用引用

c++ - 最有效的可移植溢出检测?