我想声明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) 我有一个特定的设计策略,我的类的构造函数是私有的,只能由类的朋友构建.在友元函数中,我正在尝试使用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++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)
这对我来说感觉像是一个错误,因为这两种形式在功能上应该是相同的?想法?