为嵌套模板类声明operator ==

Res*_*ion 9 c++ templates clang qdoc

我在另一个模板类中有一个以下嵌套模板类:

template<typename T>
struct A
{
    template<typename V>
    struct B {};
};
Run Code Online (Sandbox Code Playgroud)

operator==嵌套类型的非成员的签名是B什么?以下天真的尝试不起作用:

template<typename T, typename V>
bool operator==(A<T>::B<V> left, A<T>::B<V> right);
Run Code Online (Sandbox Code Playgroud)

Clang,GCC和MSVC提供了各种不同的错误和/或提示错误,例如缺少template关键字,但我没有尝试解决它.

请注意,这显然有效:

template<typename T>
struct A
{
    template<typename V>
    struct B {};

    template<typename V>
    friend bool operator==(B<V> left, B<V> right)
    {
        return true;
    }
};
Run Code Online (Sandbox Code Playgroud)

但是,我需要外部非成员声明的原因是使用qdoc记录它.qdoc正在使用clang来解析源代码,它要求我提供operator==我实际已经实现的声明,就像刚刚显示的那样.

现场演示

Cal*_*eth -1

您可以有一个内联朋友声明和一个大纲定义

template<typename T>
struct A
{
    template<typename V>
    struct B
    {
        friend bool operator==(B left, B right);
    };
};

template <typename T, typename V>
bool operator==(typename A<T>::template B<V> left, typename A<T>::template B<V> right)
{
    return true;
}
Run Code Online (Sandbox Code Playgroud)

然而海湾合作委员会警告

警告:友元声明bool operator==(A<T>::B<V>, A<T>::B<V>) 声明了一个非模板函数 [-Wnon-template-friend]

注意:(如果这不是您想要的,请确保函数模板已经声明并<>在此处的函数名称后面添加)

为了解决这个警告,我们必须在 的operator==(B left, B right)定义之前转发声明B,它只能在内部A,这将迫使它成为A也的友元。