gpt4 book ai didi

c++ - 为什么可以转换的泛型类型不能隐式转换?

转载 作者:太空狗 更新时间:2023-10-29 22:54:54 26 4
gpt4 key购买 nike

我有一个类A和一类 B , 都是带有类型参数的泛型 T . A<T> 的对象可以转换为 B<T> .我在 B 上有一个通用运算符重载我希望能够调用 A对象和一个 B对象,其中 A对象被隐式转换。

当我尝试这个时它没有编译:

template <typename T>
class A {};

template <typename T>
class B {
public:
B() {}
B(const A<T> &a) {}
};

template <typename T>
B<T> operator*(const B<T> &obj1, const B<T> &obj2) {
return B<T>(); // doesn't matter
}

int main() {
A<int> objA;
B<int> objB;

B<int> combined1 = objA * objB; // error: operator* isn't defined on these types
B<int> combined2 = static_cast<B<int>>(objA) * objB; // fine

return 0;
}

然而,当 A 和 B 不是通用的时,它工作正常:

class A {};

class B {
public:
B() {}
B(const A &a) {}
};

B operator*(const B &obj1, const B &obj2) {
return B(); // doesn't matter
}

int main() {
A objA;
B objB;

B combined1 = objA * objB; // fine
B combined2 = static_cast<B>(objA) * objB; // also fine

return 0;
}

这是为什么?使运算符重载泛型是否意味着无法推断类型?

最佳答案

一般来说,在进行参数推导时不允许隐式转换,我可以认为派生到基数是允许的。表达式

B<int> combined1 =  objA * objB;

希望为 objA * objB 找到可行的重载,包括由 ADL 找到的重载,一种可能是:

template <typename T>
B<T> operator*(const A<T> &obj1, const B<T> &obj2) {...}

但没有找到,您提供的重载不是候选者,因此调用失败,但如果您向运算符提供显式模板参数,则不会有任何推论,并且通过转换构造函数的隐式转换将允许通话:

 B<int> combined1 = operator*<int>(objA, objB);

但我不会那样做,坚持使用 cast 更好地解释意图。

关于c++ - 为什么可以转换的泛型类型不能隐式转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53897709/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com