相关疑难解决方法(0)

如何让std :: make_unique成为我班级的朋友

我想声明std::make_unique函数是我班级的朋友.原因是我想声明我的构造函数protected并提供一种使用创建对象的替代方法unique_ptr.这是一个示例代码:

#include <memory>

template <typename T>
class A
{
public:
    // Somehow I want to declare make_unique as a friend
    friend std::unique_ptr<A<T>> std::make_unique<A<T>>();


    static std::unique_ptr<A> CreateA(T x)
    {
        //return std::unique_ptr<A>(new A(x)); // works
        return std::make_unique<A>(x);         // doesn't work
    }

protected:
    A(T x) { (void)x; }
};

int main()
{
    std::unique_ptr<A<int>> a = A<int>::CreateA(5);
    (void)a;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在我收到此错误:

Start
In file included from prog.cc:1:
/usr/local/libcxx-head/include/c++/v1/memory:3152:32: error: calling a protected constructor of class 'A<int>'
return …
Run Code Online (Sandbox Code Playgroud)

c++ templates unique-ptr friend-function c++14

27
推荐指数
1
解决办法
4684
查看次数

Friend函数无法构造类的唯一指针

我有一个特定的设计策略,我的类的构造函数是私有的,只能由类的朋友构建.在友元函数中,我正在尝试使用std::make_unique但不编译来创建我的类的unique_pointer .我的VC12编译器抱怨

c:\ program files(x86)\ microsoft visual studio 12.0\vc\include\memory(1639):错误C2248:'Spam :: Spam':无法访问类'Spam'中声明的私有成员

编译过程中失败的相关代码如下

#include <memory>
class Spam {
public:
    friend void Foo();

private:
    Spam(int mem) :mem(mem) {}
    int mem;
};
void Foo() {
    std::unique_ptr<Spam> spam = std::make_unique<Spam>(10);
}
Run Code Online (Sandbox Code Playgroud)

为什么我无法编译?

c++ friend unique-ptr c++11

13
推荐指数
3
解决办法
2064
查看次数

make_unique 不会编译用于创建单例实例

全部,

我正在使用 C++14,并且正在制作一个或多或少的标准单例。我正在使用最新的 Visual Studio 2017。此代码有效:

#include <memory>
class A
{
public:
  static A& getInstance()
  {
    if (instance == nullptr)
      instance = std::unique_ptr<A>(new A());
    return *instance;
  }

private:
  A() {}
  static std::unique_ptr<A> instance;
};
std::unique_ptr<A> A::instance = nullptr;
Run Code Online (Sandbox Code Playgroud)

但是,当我将单例实例的创建更改为:

instance = std::make_unique<A>();
Run Code Online (Sandbox Code Playgroud)

我在尝试访问私有成员时收到编译错误:

Error   C2248   'A::A': cannot access private member declared in class 'A'      
c:\program files (x86)\microsoft visual studio\2017\professional\vc\tools\msvc\14.14.26428\include\memory   2510    
Run Code Online (Sandbox Code Playgroud)

这对我来说感觉像是一个错误,因为这两种形式在功能上应该是相同的?想法?

c++ singleton private-constructor unique-ptr c++14

2
推荐指数
1
解决办法
4751
查看次数