gpt4 book ai didi

c++ - 如何正确定义好友免费功能

转载 作者:行者123 更新时间:2023-11-30 01:05:21 24 4
gpt4 key购买 nike

背景

我正在尝试编写一个包含迭代器的容器。例如。它创建间接范围。我希望范围的迭代器取消引用底层迭代器。我这样做了,但是我需要关系运算符。这是重现问题的简化版本:

麦克韦

template <typename T>
struct foo
{
class bar
{
friend bool do_something(bar);
};

bar get_bar()
{
return bar{};
}
};

template <typename T>
bool do_something(typename foo<T>::bar)
{
return true;
}

#include <iostream>

int main()
{
foo<int> f;
auto b = f.get_bar();
std::cout << do_something(b);
}

/tmp/prog-c08a3a.o: In function main':
prog.cc:(.text+0x12): undefined reference to
do_something(foo::bar)'

demo on wandbox .

这是我遇到的唯一错误。

问题

什么在类内部声明,什么在类外部定义为自由函数?

我尝试了什么

编译器让我放一个模板,但这显然不是我想要的。我不希望与一种 ForwardIterator 类型相关的迭代器与另一种 ForwardIterator 类型的迭代器具有可比性。但我想好吧,让我们试试看,但它给了我阴影错误,这加强了我的怀疑。

为什么要定义inside的原因

据我所知,在内部定义它将使它只能通过 ADL 调用。有些 IDE 可能无法解决这个问题,所以我认为在外部声明它们会更好。

最佳答案

更简单的方法是直接在类中定义函数:

template <typename T>
struct foo
{
class bar
{
friend bool do_something(bar) { /* implementation */}
};

bar get_bar()
{
return bar{};
}
};

关于c++ - 如何正确定义好友免费功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48562698/

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