如何正确定义朋友免费功能

时间:2018-02-01 12:22:38

标签: c++ templates friend-function c++17

背景

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

MCVE

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;

demo on wandbox

这是我唯一的错误。

问题

在类中声明了什么以及在类之外定义为自由函数的是什么?

我尝试了什么

编译器要求我放一个模板,但这显然不是我想要的。我不希望与一个ForwardIterator类型相关的迭代器与另一个ForwardIterator类型的迭代器相比较。但我认为没问题,让我们尝试一下,但它给了我阴影错误,这增强了我的怀疑。

我想在内部定义

的原因

根据我所听到的,在里面定义它将使其只能ADL可调用。有些IDE可能没有想到这一点,所以我认为在外面声明它们会更好。

1 个答案:

答案 0 :(得分:5)

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

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

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