如何编写operator ==来使用隐式转换/构造类型

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>的演绎成功.


JBL*_*JBL 8

您可以让运算符重载类中的友元函数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)存在具有签名的功能.

  • 非常好.您可以省略`<T>`并将其声明为`operator ==(Type l,Type r)`. (3认同)

眠りネ*_*ネロク 1

您可以定义以下附加功能模板:

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)