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

时间:2015-06-19 15:48:45

标签: c++ c++14 auto

参加以下课程:

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()中调用该方法时,我无法弄清楚正确调用添加的语法...我有开放式问题,但究竟是什么问题/我到底是怎么回事?语法上从我的主...

调用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
}

1 个答案:

答案 0 :(得分:1)

主要是,另一个用户说的这个BasicOperations<int> t(int, int);是没有意义的。使用调试器时,它显示为函数声明,而不是作为构造函数的预期用途。即使无法定义本地函数,仍然可以声明它们。因此,即使t存在,它也是一个函数,因此在t.addition()中,它无法将t识别为包含方法{{{class}}的对象BasicOperations 1}}。

快速修复:

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>();被读作函数声明的原因。