gpt4 book ai didi

c++ - ostream& 运算符中的类型转换 <<

转载 作者:搜寻专家 更新时间:2023-10-31 00:10:52 24 4
gpt4 key购买 nike

我有一个类entry和一个 ostream& operator <<为它覆盖。我还有一个辅助类cursor和类型转换 operator entry() .然后,在我的 main()函数我有以下表达式:

cout << data[4];

哪里data[4]cursor , 但编译失败并显示

error: invalid operands to binary expression

我想要的是让编译器转换 data[4]entry并使用其 <<运算符(operator)。有没有办法以上述方式调用此 ostream 运算符,而无需向 entry 添加特殊方法? ?

下面是一些代码:

    class entry
{
friend class cursor;
/*here comes some data*/

public:

friend ostream& operator << (ostream& out, const entry& a);
};

    class cursor
{
database* data_;
size_t ind_;
friend class entry;
friend class database;

public:
cursor (database* a, size_t ind);
cursor (const cursor& a);
void operator= (const entry x);
void operator= (const cursor a);

operator entry(); //type conversion
};

这是我在 main() 中使用的:

    cout << data[4];

最佳答案

当你写的时候:

class entry
{
// ...
friend ostream& operator << (ostream& out, const entry& a);
};

虽然这声明了 operator<<在封闭范围内,名称查找规则表明在该范围内的名称查找实际上并没有找到这个函数! (因为它只是通过 friend 声明的)。

如果函数仅通过 friend 声明,那么找到它的唯一方法是通过参数相关的查找。参见 this thread查找规则的更详细解释。

该函数将通过以下方式找到:

entry e;
cout << e;

因为 ADL 看到有一个类型为 entry 的参数因此它搜索与 entry 关联的函数(包括在那里声明的 friend )。

然而,cursor c; cout << c;不包括 entry在其搜索列表中(即使存在从 cursorentry 的转换)。


要解决此问题,您需要提供运算符的非友元声明,该声明在 main 处可见。 .例如:

ostream& operator << (ostream& out, const class entry& a);

class entry
{
// ...
friend ostream& operator << (ostream& out, const entry& a);
};

注意。我选择将声明放在类之前而不是之后,因为这也是解决模板 friend 问题的最佳方式。

关于c++ - ostream& 运算符中的类型转换 <<,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36072919/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com