使用头文件中的 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);
被读取为函数声明的原因。
采取以下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);
被读取为函数声明的原因。