Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
运算符[]错误不匹配 我一直在尝试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 - Fatal编程技术网 l)+n; } }; 内部主(空){ obj a; a、 l=20; cout,c++,templates,operator-overloading,C++,Templates,Operator Overloading" /> l)+n; } }; 内部主(空){ obj a; a、 l=20; cout,c++,templates,operator-overloading,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; } #包括“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];