c++ - 模板类运算符重载返回类型

标签 c++ class templates operator-overloading

我正在尝试构建一个模板化的 num 类。该类需要有一个类型为 T 的公共(public)属性 val,这是唯一的模板化参数。此外,如果提供一个值,则应使用该值初始化属性 (val)。为此,我编写了以下代码:

#include <iostream>

template<class T>
class Num {
public: 
    T val;

    Num():val(0) { std::cout<<"default constr used"<<std::endl; }
    Num(T value):val(value) {std::cout<<"constr (T value) used"<<std::endl; }
    ~Num() { std::cout<<"destructor used"<<std::endl; }

    template<typename U>
    Num operator+(const Num<U>& other) {
        return val+other.value;
    }
};

此外,我创建了 main() 函数来测试程序,如下所示:

int main() {
    std::cout << Num<int>(1) + Num<double>(2.0);
    return 0;
}

但是程序的结果现在是3。而我预计它是 3.0 (类型为 double)。

最佳答案

为此,您需要更改返回类型。

在您的代码中:

// vvv---- Means Num<T>
   Num operator+(const Num<U>& other) {
       return val + other.val;
   }

事实上,在类模板中,您可以键入不带模板参数的类名称,这在某种程度上相当于编写 Num<T> .

无论加法本身的类型是什么,您的函数始终返回第一个操作符的类型。

您想要的是从加法中推断出该类型:

auto operator+(const Num<U>& other) -> Num<decltype(val + other.val)> {
    return val + other.val;
}

这样,根据 C++ 运算符规则,它始终是正确的返回类型。

关于c++ - 模板类运算符重载返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59256707/

相关文章:

c++ - 如何获取 Windows 进程的当前音频输出级别?

javascript - 使 Qt QWebView Bridge 可从 Webkit IFRAME(本地页面)访问的技巧

c++ - 错误 : cannot add a default template argument to the definition of a member of a class template

c++ - 如何从另一个程序运行一个程序并通过 C 或 C++ 中的标准输入将数据传递给它?

c++ - 增强融合 : convert adapted struct type to text

C++ 解释函数类型

c++ - 类中的对象、数字/数组或对象

c++ - 在 C++ 中使用指针总是不好的吗?

c++ - 为什么在函数体内使用 `typename`

c++ - 模板函数参数类型中的模板标识符与 decltype