use*_*762 14 c++ oop templates operator-overloading
为什么这不起作用,因为有一个隐式"构造"的选项?
class A {};
template<typename T>
class Type {
public:
Type() = default;
Type(T* ptr) {
}
};
template<typename T>
bool operator==(Type<T> l, Type<T> r) {
return true;
}
int main() {
A a;
Type<A> type(&a);
bool v = (type == &a); // Does not work
//bool v = (type == Type<A>(&a)); // That would work
}
Run Code Online (Sandbox Code Playgroud)
为什么隐式构造没有使用Type<A>
(&base
,哪个A*
)?
我怎么能写这个代码才能使它工作?
n. *_* m. 11
检查功能模板的可行性时,不会考虑用户定义的转换.
在检查功能模板的可行性时,实现尝试根据模板参数推导规则推导模板参数.这些规则不涉及任何类型转换(仅限类型调整,如删除限定符和引用).如果扣除失败,候选人将被拒绝.
在你的情况下,T
不能从Type<A>
和推断A
.您需要两个参数才能使相同类型Type<X>
的演绎成功.
您可以让运算符重载类中的友元函数Type
,如下所示:
template<typename T>
class Type {
public:
Type() = default;
Type(T* ptr) {
}
inline friend bool operator==(Type<T> l, Type<T> r) {
return true;
}
};
Run Code Online (Sandbox Code Playgroud)
这可以确保从声明变量的那一刻开始实例化操作符Type<A> type;
.
在你的情况下,它没有实例化.当您调用运算符时,编译器可以创建模板的实例,但它失败,因为模板运算符声明不能推断出参数Type<A>
和A*
.这实际上是您收到的错误消息:
错误:'operator =='不匹配(操作数类型为'Type'和'A*')
因此,Type<A>
甚至没有考虑隐式构造,因为此时不bool operator==(Type<A> l, Type<A> r)
存在具有签名的功能.
您可以定义以下附加功能模板:
template<typename T>
bool operator==(Type<T> l, T* r) {
return l == Type<T>{r};
}
Run Code Online (Sandbox Code Playgroud)
该函数模板的主体显式构造函数模板所需的对象Type<T>
,以便正确推导T
,以便可以实例化它。
这样,type == &a
将导致调用此函数模板的实例化,该函数模板又调用函数模板的实例化bool operator==(Type<T> l, Type<T> r)
。
归档时间: |
|
查看次数: |
776 次 |
最近记录: |