我一直在尝试在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;
}
如果我使用模板,我只会收到此错误。例如,此代码有效:
#include "JSE.h"
#include <iostream>
using namespace std;
struct obj{
int l;
int operator[] (int n){
return (this->l)+n;
}
};
int main(void){
obj a;
a.l=20;
cout<<a[4];
return 0;
}
导致错误的原因是什么?如何解决? 注意:我真的想保留模板,因为我将在未来的项目中使用运算符重载。
答案 0 :(得分:1)
问题是对于第一个程序,编译器无法确定运算符的返回类型。
您只能像
一样调用运算符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];
答案 1 :(得分:0)
为了使模板推断起作用,编译器必须能够以某种方式推断出你正在使用的类型。
template<typename varname>
varname operator[] (int n){
return (this->l)+n;
}
不允许这个,因为你模板的唯一东西是返回类型。编译器无法知道您想要什么类型作为返回类型,因此您收到类似this的错误。
如果你在函数参数中使用模板类型,那么编译器可以推导出模板类型,因为它可以使用传递给函数的类型。
#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;
}