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也的友元。