使用头文件中的 auto 关键字访问推导的方法调用

Accessing deduced method calls with auto keyword from header file

采取以下class:

BasicOperations.h

template<typename T1>
class BasicOperations
{
    private:
        T1 num;

    public:
        template<typename T1, typename T2>
        BasicOperations() : num(0) {}

        template<typename T1, typename T2> 
        auto addition(T1 num1, T2 num2) -> decltype(T1 + T2) const { return num1 + num2; }
}

我已经开始使用 auto 并且根据我的研究发现这就是声明上面代码中列出的函数 addition 的方法。

但是,当我尝试在我的 Main() 中调用该方法时,我无法弄清楚正确调用加法的语法...我有开放式问题,但究竟有什么问题/究竟如何我是否在语法上从我的 main...

中调用 addition 函数

Main.cpp

#include <iostream>
#include "BasicOperations.h"

int main()
{
    int x = 10, y = 5;
    BasicOperations<int> t(int, int);

    //std::cout << t.addition( x, y ) << '\n'; Error: expression must have class type
}

总的来说,这个BasicOperations<int> t(int, int);正如另一个用户所说,没有意义。使用调试器时,它显示为函数声明,而不是其作为构造函数的预期目的。即使局部函数不能被定义,它们仍然可以被声明。因此,即使 t 存在,它也是一个函数,因此在 t.addition() 中它无法将 t 识别为包含该方法的 class BasicOperations 的对象addition.

快速修复:

template<typename T1>
class BasicOperations
{
    private:
        T1 num;

    public:
        //template<typename T1, typename T2>
        BasicOperations() : num(0) {}

        template<typename T1, typename T2> 
        auto addition(T1 num1, T2 num2) -> decltype(num1 + num2) const { return num1 + num2; }
};

int main()
{
    int x = 10, y = 5;
    BasicOperations<int> t;

    std::cout << t.addition( x, y ) << '\n'; 
    return 0;
}

消除 template<typename T1, typename T2> 以上默认构造函数。另外在-> decltype(T1 + T2)应该改成-> decltype(num1 + num2).

使用模板构造函数时,无法在调用构造函数模板时显式指定模板参数。这意味着不能写:

BasicOperations<int> t<int,int>();

相反,模板的类型必须通过参数推导来推导。但是,代码中的构造函数不带参数,这就是为什么 BasicOperations<int> t(int,int); 被读取为函数声明的原因。