无法从模板友元函数访问私有成员

时间:2017-11-20 16:03:41

标签: c++ oop templates c++14

以下是我的代码示例:

#include <iostream>
#include <memory>

class Base
{
public:
  virtual void name() = 0;
};

using ptr_t = std::unique_ptr<Base>;

class A : public Base
{
  A(int x) : n(x) {}

public:
  void name() override
  {
    std::cout << "Test " << n << "\n";
  }

  template <typename T>
  friend ptr_t create(int x);

private:
  int n;
};

template <typename T>
ptr_t create(int x)
{
  return std::make_unique<T>(x);
}

int main()
{
  auto a = create<A>(3);
  a->name();
}

起初我认为问题出在从std::unique_ptr<A>std::unique_ptr<Base>的转换中。但这似乎在隔离的代码示例中工作正常,并且根据这个答案也是正确的: unique_ptr to a base class

如果我使用原始指针而不是唯一指针,上面的代码也可以工作。

有人能解释我所缺少的东西。谢谢。

1 个答案:

答案 0 :(得分:2)

请注意,您的朋友功能的签名需要与其实现相匹配:

class A
{
  A() {}

  template <typename T>
  friend T* create();
};

template <typename T>
T* create()
{
    return new T;
}

int main()
{
    auto a = create<A>();
}

已更新至您的新问题。你需要朋友make_unique,它是访问构造函数的函数。但为什么你需要模板?这对我有用:

#include <iostream>
#include <memory>

class Base
{
public:
  virtual void name() = 0;
};


class A final : public Base
{
  A(int x) : n(x) {}

public:
  void name() override
  {
    std::cout << "Test :" << n << "\n";
  }

  friend std::unique_ptr<A> std::make_unique<A>(int& x);

private:
  int n;
};

std::unique_ptr<A> create(int x)
{
  return std::make_unique<A>(x);
}

int main()
{
  auto a = create(3);
  a->name();

}