不匹配operator []错误

时间:2015-06-23 12:06:13

标签: c++ templates operator-overloading

我一直在尝试在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;
}

导致错误的原因是什么?如何解决? 注意:我真的想保留模板,因为我将在未来的项目中使用运算符重载。

2 个答案:

答案 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;
}

Live example