我试图编写一个包含迭代器的容器。例如。它创建了间接范围。我希望范围的迭代器取消引用底层迭代器。我做到了,但后来我需要关系运算符。以下是重现问题的简化版本:
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:在函数
main': prog.cc:(.text+0x12): undefined reference to
do_something(foo :: bar)&#39;
这是我唯一的错误。
在类中声明了什么以及在类之外定义为自由函数的是什么?
编译器要求我放一个模板,但这显然不是我想要的。我不希望与一个ForwardIterator
类型相关的迭代器与另一个ForwardIterator
类型的迭代器相比较。但我认为没问题,让我们尝试一下,但它给了我阴影错误,这增强了我的怀疑。
根据我所听到的,在里面定义它将使其只能ADL可调用。有些IDE可能没有想到这一点,所以我认为在外面声明它们会更好。
答案 0 :(得分:5)
更简单的是直接在类中定义函数:
template <typename T>
struct foo
{
class bar
{
friend bool do_something(bar) { /* implementation */}
};
bar get_bar()
{
return bar{};
}
};