命名空间内的CRTP与typdfs和朋友

CRTP inside namespace vs typdefs and friends

本文关键字:typdfs 朋友 CRTP 命名空间      更新时间:2023-10-16

我与编译器斗争了一整晚,我的想法都用完了。。。

我在一个具有受保护函数的命名空间中有一个CRTP构造。派生类(也在该命名空间内)被类型化为另一个名称。

接下来我有一个类(也被类型化为另一个名称),它有一个试图调用该函数的静态函数。所以我开始交朋友,但编译器(在我的情况下是VS 2010)仍然不会允许我访问该函数。

因为有些代码可能更清楚:

namespace foobar
{
namespace internal
{
    template <typename T>
    class A
    {
        friend class E;
    protected:
        void foo()
        {
            static_cast<T*>(this)->_foo();
        }
    };
    class B : public A<B>
    {
        friend class E;
        friend class A<B>;
    protected:
        void _foo()
        {
            printf("Foo from Bn");
        }
    };
}
typedef internal::B C;
class D
{
public:
    static void Bar();
};
typedef D E;
    void D::Bar()
    {
        C mB;
        mB.foo();
    }   
}//foobar namespace

有人能告诉我我在这里没有看到什么吗?如何解决这个问题?

欢呼

您的声明friend class E正向声明了一个与class foobar::D无关的class foobar::internal::E。在将DE声明为好友之前,您必须声明它们:

namespace foobar
{
  class D;
  typedef D E;
  namespace internal
  {
    template <typename T>
    class A
    {
      friend E;
      // ...

请注意,这只适用于C++11。对于C++03,您根本不能将typedef声明为友元,因此需要编写friend class ::foobar::D