模板 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.
以下代码工作正常:
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.