如何使参数化的基础成为 CRTP 中派生的朋友

How to make parameterized Base a friend of Derived in CRTP?

本文关键字:CRTP 朋友 派生 何使 参数      更新时间:2023-10-16

我想在参数化的 Base 上实现 CRTP,并使 Base 成为 Derived 的朋友:

template <template <typename> class Derived, class T>
class Base;
template <class T>
class Derived : public Base<Derived, T>
{
  friend class Base<Derived, T>;
};

我在VS2012上出现编译错误,并显示以下消息:

error C3200: 'Derived<T>' : invalid template argument for template parameter 'Derived', expected a class template

感谢您的帮助。

试试这个:

friend class Base<::Derived, T>;

如果这不起作用,您的编译器不支持这种形式的朋友声明(它应该,但我知道什么),您必须通过将友谊扩展到所有 Base 实例来解决此问题。

template <template <typename> class D, class BT>
friend class Base;