c – 在嵌套类中定义的静态模板函数必须要做什么才能在兄弟嵌套类中声明为朋友?


Linux上使用GCC 4.8.2,我想授予工厂方法Create()访问类C的私有构造函数,但是在尝试声明一个专门的朋友时,我得到“错误:’未在此范围中声明’创建’ .如何在不向B :: Create()的所有类型打开声明的情况下使其工作?

template <typename T> class A {
 public:
  class B;
  template <typename U> class C;
};

template <typename T>
class A<T>::B {
 public:
  template <typename U> static void Create();
};

template <typename T> template <typename U>
class A<T>::C {
  C() = default;
  friend void B::Create<U>();
};

template <typename T> template <typename U>
void A<T>::B::Create() {
  C<U>{};
}

int main() {
  A<int>::B::Create<char>();
}

最佳答案 我认为你遇到了编译器缺陷.以下代码仅使用一层模板,在g 4.8.2中工作正常.

class Foo
{
   public:
      template <typename U> static Foo* Create();
};

template <typename U> class Bar : public Foo
{
   private:
      Bar() = default;

      friend Foo* Foo::Create<U>();
};

template <typename U>
Foo* Foo::Create() {
  return new Bar<U>();
}

但是,相同的编译器无法编译您的代码.我认为你已经尝试过的一种解决方法是更换

friend B* B::Create<U>();

template <typename V> 
friend B* B::Create<V>();
点赞