参加以下课程:
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
}
答案 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>();
被读作函数声明的原因。