using
声明很常见,适用于包括构造函数在内的其他成员方法,但对于转换运算符来说,似乎不那么简单。GCC 有语法using base::operator base
需要介绍,但 Clang 拒绝了。两个编译器都接受声明前向函数,但在我看来这有点复杂。
示例使用 gcc 14.2.0 和 clang 19.1.7、std=c++20 进行了测试。SFINAE 继承被 clang 拒绝。
struct base {
template <typename T> requires (std::is_integral_v<T>)
operator T() const { printf("to int\n"); return 0; }
};
struct derived: base {
//using base::operator; // denied by clang & gcc
//using base::operator base; // denied by clang
template <typename T> requires (std::is_floating_point_v<T>)
operator T() const { printf("to float\n"); return 0; }
// both accept
template <typename T> requires requires { (T) std::declval<base>(); }
operator T() const { return base::operator T(); }
};
derived D;
(int) D; // -> to int
(float) D; // -> to float
转换函数模板是少数不能通过使用声明([namespace.udecl] p1)继承的东西之一:
GCC 接受已知的错误 29027,该错误
using base::operator base;
自2006年以来一直未解决。您的解决方法已经没问题了,但可以稍微改进:
使用声明:
因此,您必须采取变通方法,就像您目前所采用的方法一样。