自定义结构,报“左值”错误!

LeonTown 2009-06-22 03:15:12
代码:

struct RedGroup
{
vector<string> vRecords;
string operator [] (unsigned int index)
{
return vRecords[index];
}
};

string strLine = redGroup[0];
//报错:error C2678: binary '[' : no operator found which takes a left-hand operand of type 'const RedGroup' (or there is no acceptable conversion)


大家看是怎么回事呢?

谢谢!!
...全文
58 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
snowman52013 2009-06-22
  • 打赏
  • 举报
回复
帮你顶一下。我也是新手
yang_e_2009 2009-06-22
  • 打赏
  • 举报
回复
因为operator[]虽然并不会改变调用对象的值 但是对象不知道
如果对象是一个const常量对象 它"不敢"使用[] 因为它"害怕"[]会改变它的值 所以这样是不合法的
string operator [] (unsigned int index)const
参数列表后面的const 表示 "[]承诺不会改变对象的值 对于const对象来说[]是安全的"
加上const后 []内部如果有改变的尝试就会有编译错误..
const对象只会信任const成员函数
---引自XXX

如果函数不改变对象的值 那么最好声明为const 比如< > == != 等
goodname 2009-06-22
  • 打赏
  • 举报
回复


主要在于你的redGroup怎么定义的。如果是const RedGroup,那么要使用const的[]才可以匹配
pengzhixi 2009-06-22
  • 打赏
  • 举报
回复
确认你的vector<string> vRecords;
不为空
LeonTown 2009-06-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 LeonTown 的回复:]
引用 7 楼 yang_e_2009 的回复:
因为你的对象是一个const对象 不可以调用[]
要这样才行

C/C++ code
string operator [] (unsigned int index)const //后面加个const就可以了
{
return vRecords[index];
}

果然可以了!
麻烦您,能给解释一下吗?
谢谢!

给分啊~
[/Quote]

顶一下哈~
LeonTown 2009-06-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 yang_e_2009 的回复:]
因为你的对象是一个const对象 不可以调用[]
要这样才行

C/C++ code
string operator [] (unsigned int index)const //后面加个const就可以了
{
return vRecords[index];
}
[/Quote]


果然可以了!
麻烦您,能给解释一下吗?
谢谢!

给分啊~
yang_e_2009 2009-06-22
  • 打赏
  • 举报
回复
如果这样就会有你上面的错误

const RedGroup A;
string s = A[0]; // error C2678: 二进制“[”: 没有找到接受“const RedGroup”类型的左操作数的运算符(或没有可接受的转换)
yang_e_2009 2009-06-22
  • 打赏
  • 举报
回复
因为你的对象是一个const对象 不可以调用[]
要这样才行

string operator [] (unsigned int index)const //后面加个const就可以了
{
return vRecords[index];
}
LeonTown 2009-06-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jest850615 的回复:]
你的对象成功构造了么?
[/Quote]

我的RedGroup只是一个结构,
这里也没必要定义构造函数吧。

另外,
如下代码没有报错:

RedGroup rgFind;
rgFind.push_back(redGroup[0]); //调用[],没有报错

//这里的RedGroup
//添加了部分函数:
struct RedGroup
{
vector<string> vRecords;
unsigned int size() const
{
return vRecords.size();
}
string operator [] (unsigned int index)
{
return vRecords[index];
}
void push_back(const string& str)
{
vRecords.push_back(str);
}
void clear()
{
vRecords.clear();
}

bool operator < (const RedGroup& r)
{
return vRecords[0] < r.vRecords[0];
}
bool operator > (const RedGroup& r)
{
return vRecords[0] > r.vRecords[0];
}
bool operator == (const RedGroup& r)
{
return vRecords[0] == r.vRecords[0];
}

};
wesleyluo 2009-06-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 LeonTown 的回复:]
我发现,单独测试我给出的代码,
没有问题。

但放到我的上下文环境下,
就出问题。

那,可能是什么原因呢?~
[/Quote]
上下文有问题,仔细检查你就发现了。
FengRider 2009-06-22
  • 打赏
  • 举报
回复
确实,先检查一下对象有没有成功创建。别说你先申明了一个RedGroup的指针,却并没有定义这么一个对象。
jest850615 2009-06-22
  • 打赏
  • 举报
回复
你的对象成功构造了么?
LeonTown 2009-06-22
  • 打赏
  • 举报
回复
我发现,单独测试我给出的代码,
没有问题。

但放到我的上下文环境下,
就出问题。

那,可能是什么原因呢?~
「已注销」 2009-06-22
  • 打赏
  • 举报
回复
这样试试:
#include <iostream>
#include <string>
#include <vector>

using namespace std;

struct RedGroup
{
RedGroup(string s)
{
vRecords.push_back(s);
}
vector<string> vRecords;
string operator [] (unsigned int index)
{
return vRecords[index];
}
};

int main()
{
RedGroup redGroup("OK");
string strLine = redGroup[0];
cout << strLine << endl;

return 0;
}

输出OK

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧