为什么模板参数推导失败?

最小化的示例:

template <typename T, int N>
struct Deducer {
    Deducer(int) {}
};

template <typename T, int N = 1>
void foo(Deducer<T, N> d){}

int main() {
    foo<char>(345);
}

godbolt example

屈服误差

candidate template ignored: could not match 'Deducer<char, N>' against 'int'

为什么编译器会忽略隐式强制转换?

如果这里有任何简单的解决方法?

我可以考虑以下两种选择:

(1)指定所有模板参数(对我来说不是一个选项,实际情况中有很多,我想推论) (2)编写这样的中间函数:

template <typename T, int N = 1>
void foo_step(int d){ foo<T, N>(d); }

也没有选择,我有很多参数。

有任何想法吗?

评论