模板 class 没有可接受的转换

template class has no acceptable convertion

以下代码工作正常:

struct A {
    int d;
    A(int _d) : d(_d) {}
};
A operator+(const A& x, const A& y) {
    return x.d + y.d;
}
int main() {
    A x = 6;
    cout << (x + 4).d << endl;
    cout << (4 + x).d << endl;
}

但是,如果我将 A 设为模板 class,则它不会编译:

template<int p>
struct A {
    int d;
    A(int _d) : d(_d) {}
};
template<int p>
A<p> operator+(const A<p>& x, const A<p>& y) {
    return x.d + y.d;
}
int main() {
    A<0> x = 6;                // OK
    cout << (x + 4).d << endl; // error: no operator found or there is no acceptable convertion
    cout << (4 + x).d << endl; // error: no operator found or there is no acceptable convertion
}

当我进行显式转换 A<0>(4)(A<0>)4 时它可以工作,但它很烦人。

我想知道是什么导致了“正常”和“模板”之间的差异 classes,以及如何才能使隐式转换正常工作。

如果重要的话,我正在使用 MSVC 编译器。

问题模板参数推导不考虑隐式转换您提供的一个 转换构造函数

来自template argument deduction's documentation

Type deduction does not consider implicit conversions (other than type adjustments listed above): that's the job for overload resolution, which happens later.