如何让 std::make_unique 成为我 class 的朋友
How to make std::make_unique a friend of my class
我想将 std::make_unique
函数声明为我的 class 的好友。原因是我想声明我的构造函数 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;
}
现在我收到这个错误:
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 unique_ptr<_Tp>(new _Tp(_VSTD::forward<_Args>(__args)...));
^
prog.cc:13:21: note: in instantiation of function template specialization 'std::__1::make_unique<A<int>, int &>' requested here
return std::make_unique<A>(x); // doesn't work
^
prog.cc:22:41: note: in instantiation of member function 'A<int>::CreateA' requested here
std::unique_ptr<A<int>> a = A<int>::CreateA(5);
^
prog.cc:17:5: note: declared protected here
A(T x) { (void)x; }
^
1 error generated.
1
Finish
将 std::make_unique
声明为我的 class 好友的正确方法是什么?
make_unique
完美转发你传递给它的参数;在您的示例中,您将左值 (x
) 传递给函数,因此它会将参数类型推断为 int&
。您的 friend
函数声明需要
friend std::unique_ptr<A> std::make_unique<A>(T&);
同样,如果您要在 CreateA
内 move(x)
,则 friend
声明需要
friend std::unique_ptr<A> std::make_unique<A>(T&&);
这会将代码获取到 compile,但绝不保证它会在另一个实现上编译,因为众所周知,make_unique
将其参数转发给另一个内部助手实际实例化您的 class 的函数,在这种情况下,助手需要是 friend
.
我想将 std::make_unique
函数声明为我的 class 的好友。原因是我想声明我的构造函数 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;
}
现在我收到这个错误:
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 unique_ptr<_Tp>(new _Tp(_VSTD::forward<_Args>(__args)...));
^
prog.cc:13:21: note: in instantiation of function template specialization 'std::__1::make_unique<A<int>, int &>' requested here
return std::make_unique<A>(x); // doesn't work
^
prog.cc:22:41: note: in instantiation of member function 'A<int>::CreateA' requested here
std::unique_ptr<A<int>> a = A<int>::CreateA(5);
^
prog.cc:17:5: note: declared protected here
A(T x) { (void)x; }
^
1 error generated.
1
Finish
将 std::make_unique
声明为我的 class 好友的正确方法是什么?
make_unique
完美转发你传递给它的参数;在您的示例中,您将左值 (x
) 传递给函数,因此它会将参数类型推断为 int&
。您的 friend
函数声明需要
friend std::unique_ptr<A> std::make_unique<A>(T&);
同样,如果您要在 CreateA
内 move(x)
,则 friend
声明需要
friend std::unique_ptr<A> std::make_unique<A>(T&&);
这会将代码获取到 compile,但绝不保证它会在另一个实现上编译,因为众所周知,make_unique
将其参数转发给另一个内部助手实际实例化您的 class 的函数,在这种情况下,助手需要是 friend
.