具有约束条件的模板类友谊

Template class friendship with constraints

提问人:Lassie 提问时间:6/6/2023 最后编辑:user16217248Lassie 更新时间:6/7/2023 访问量:64

问:

我尝试了以下方法,但它无法编译:

template<class LabelType>
    requires requires { typename LabelType::LetterType; }
class MonoidalFSA
{
    template<class T>
    friend class MonoidalFSA;
};
error: redeclaration of ‘template<class LabelType>  requires requires{typename LabelType::LetterType;} class MonoidalFSA’ with different constraints

尝试将约束也添加到朋友声明中,但我仍然遇到同样的错误。

template<class LabelType>
    requires requires { typename LabelType::LetterType; }
class MonoidalFSA
{
    template<class T>
        requires requires { typename T::LetterType; }
    friend class MonoidalFSA;
};
C++ 模板 C++20

评论

0赞 NathanOliver 6/6/2023
尝试template<typename> friend class MonoidalFSA;
0赞 Lassie 6/7/2023
@NathanOliver 同样的错误。

答:

3赞 Artyer 6/7/2023 #1

您的第二个片段是正确的,但看起来 gcc 不接受它,因为它认为这两个 requires 表达式不等价。

如果你把它总结成一个概念,它就被接受了:

template<typename LabelType>
concept HasLetterType = requires { typename LabelType::LetterType; };

template<class LabelType> requires HasLetterType<LabelType>
class MonoidalFSA
{
    template<class T> requires HasLetterType<T>
    friend class MonoidalFSA;
};

// Or simply
template<HasLetterType LabelType>
class MonoidalFSA
{
    template<HasLetterType>
    friend class MonoidalFSA;
};