gpt4 book ai didi

C++自动构造函数调用模板运算符重载?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:03:33 27 4
gpt4 key购买 nike

我的头文件中有以下内容:

template<typename T>
class rational {
private:
T num;
T denom;
T gcd(T x, T y);

public:
rational(T num, T denom);
rational(T wholeNumber);

template<typename U>
friend inline rational<U> operator *(const rational<U> &lhs, const rational<U> &rhs);
}

template<typename T>
rational<T>::rational(T whole) {
this->num = whole;
this->denom = 1;
}

template<typename T>
rational<T> operator *(const rational<T> &lhs, const rational<T> &rhs) {
return rational<T>(lhs.num * rhs.num, lhs.denom * rhs.denom);
}

我的主要内容如下:

rational<int> x(6), y(2);
rational<int> product = y * x; // this works
rational<int> product2 = 2 * x; // this doesn't

第一个产品有效,但第二个产品给我“错误:‘2 * x’中的‘operator*’不匹配”。为什么?既然有一个只接受 2 作为参数的可用构造函数,难道不应该自动调用它吗?如果不是,我还能如何使运算符(operator)重载以同时完成这两项工作?

谢谢。

最佳答案

我不确定为什么编译器不会在 2 上隐式调用单参数构造函数来生成有理数,但我的猜测是,当涉及模板时,推理机制就会被破坏。

一种解决方法(如果没有人知道如何解决隐式构造函数问题)是定义一个额外的乘法运算符,如下所示:

template<typename T>
rational<T> operator *(const T &lhs, const rational<T> &rhs) {
return rational<T>(lhs * rhs.num, rhs.denom);
}
template<typename T>
rational<T> operator *(const rational<T> &lhs, const T &rhs) {
return rational<T>(lhs.num * rhs, lhs.denom);
}

如果您在某处的内部循环中使用有理数编写高性能代码,这也会表现得更好。

关于C++自动构造函数调用模板运算符重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9324590/

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