运算符[]错误不匹配 我一直在尝试C++中的操作重载,我尝试使用模板。但我得到了一个错误:错误:与“a[4]”中的“operator[]”不匹配。 这是我的密码: #include "JSE.h" #include <iostream> using namespace std; struct obj{ int l; template<typename varname> varname operator[] (int n){ return (this->l)+n; } }; int main(void){ obj a; a.l=20; cout<<a[4]; return 0; } #包括“JSE.h” #包括 使用名称空间std; 结构对象{ int l; 模板 varname运算符[](int n){ 返回(此->l)+n; } }; 内部主(空){ obj a; a、 l=20; cout
为了让模板推断工作,编译器必须能够以某种方式推断出您正在使用的类型运算符[]错误不匹配 我一直在尝试C++中的操作重载,我尝试使用模板。但我得到了一个错误:错误:与“a[4]”中的“operator[]”不匹配。 这是我的密码: #include "JSE.h" #include <iostream> using namespace std; struct obj{ int l; template<typename varname> varname operator[] (int n){ return (this->l)+n; } }; int main(void){ obj a; a.l=20; cout<<a[4]; return 0; } #包括“JSE.h” #包括 使用名称空间std; 结构对象{ int l; 模板 varname运算符[](int n){ 返回(此->l)+n; } }; 内部主(空){ obj a; a、 l=20; cout,c++,templates,operator-overloading,C++,Templates,Operator Overloading,为了让模板推断工作,编译器必须能够以某种方式推断出您正在使用的类型 template<typename varname> varname operator[] (int n){ return (this->l)+n; } 模板 varname运算符[](int n){ 返回(此->l)+n; } 不允许这样做,因为您正在模板化的唯一内容是返回类型。编译器无法知道您想要什么类型的返回类型,因此您会遇到类似错误的情况 如果改为在函数参数中使用模板类型,则编译器可以推断模
template<typename varname>
varname operator[] (int n){
return (this->l)+n;
}
模板
varname运算符[](int n){
返回(此->l)+n;
}
不允许这样做,因为您正在模板化的唯一内容是返回类型。编译器无法知道您想要什么类型的返回类型,因此您会遇到类似错误的情况
如果改为在函数参数中使用模板类型,则编译器可以推断模板类型,因为它可以使用传递给函数的类型
#include <iostream>
using namespace std;
struct obj{
int l;
template<typename varname>
varname operator[] (varname n){
return (this->l)+n;
}
};
int main(void){
obj a;
a.l=20;
cout<<a[4];
return 0;
}
#包括
使用名称空间std;
结构对象{
int l;
模板
varname运算符[](varname n){
返回(此->l)+n;
}
};
内部主(空){
obj a;
a、 l=20;
cout问题在于,对于第一个程序,编译器无法确定运算符的返回类型
你只能像这样打电话给接线员
obj a;
a.l=20;
std::cout<< a.operator []<int>( 4 ) << std::endl;
obja;
a、 l=20;
std::couthow您的操作符[]
应该推断varname
?我看不出您的两个代码片段之间有任何区别。您能指出这两个代码示例之间的区别吗?我不明白。您想添加两个始终为“int”类型的对象,并希望使用操作符将结果强制转换为其他类型[]?@carlosarandersson如果返回值始终为int+int,那么您为什么需要对返回值进行模板化?显然,无论发生什么情况,导出的类型都应始终为int。它不应该从结果始终为int+int这一事实中推导出吗?@carlosarandersson为什么要使用模板?
obj a;
a.l=20;
std::cout<< a.operator []<int>( 4 ) << std::endl;
template<typename varname>
struct obj{
varname l;
varname operator[] (int n){
return (this->l)+n;
}
};
obj<int> a;
a.l=20;
cout<<a[4];