绑定错误 make_unique
Error binding make_unique
我在使用 std::bind
和 std::make_unique
时遇到问题。
我有一个对象,我向其构造函数传递了工厂函数,用于制作 std::unique_ptr
另一种 class 类型的对象。
使用 VS2013,这有效:
Tester tester(
[](){return std::make_unique<AlphaBetaSingleThreadSSE>( 0,7 ); },
[](){return std::make_unique<AlphaBetaSingleThread>( 0,7 ); },
20 );
这给我编译错误:
Tester tester(
std::bind( std::make_unique<AlphaBetaSingleThreadSSE>,0,7 ),
std::bind( std::make_unique<AlphaBetaSingleThread>,0,7 ),
20 );
错误消息状态:
error C2512: 'AlphaBetaSingleThread' : no appropriate default
constructor available
error C2512: 'AlphaBetaSingleThreadSSE' : no
appropriate default constructor available
为什么 std::bind
方法会失败?
std::make_unique
定义如下:
§ 20.8.1.4 [unique.ptr.create]
template <class T, class... Args> unique_ptr<T> make_unique(Args&&... args);
1 Remarks: This function shall not participate in overload resolution unless T
is not an array.
2 Returns: unique_ptr<T>(new T(std::forward<Args>(args)...)).
通过使用 std::make_unique<AlphaBetaSingleThreadSSE>
显式实例化此函数模板,您最终得到以下特化:
std::unique_ptr<AlphaBetaSingleThreadSSE> make_unique()
{
return std::unique_ptr<AlphaBetaSingleThreadSSE>(new AlphaBetaSingleThreadSSE());
}
也就是说,它不再允许您传递将转发给 AlphaBetaSingleThreadSSE
的构造函数的额外参数,而是尝试使用 AlphaBetaSingleThreadSSE
的默认构造函数(不存在,如错误消息所述)。
您可以通过同时指定类型模板参数来解决这个问题 Args
:
std::make_unique<AlphaBetaSingleThreadSSE, const int&, const int&>
但是你不会从完美转发中受益,而且这也不是一个可移植的解决方案。更好的解决方案是继续使用 lambda。
我在使用 std::bind
和 std::make_unique
时遇到问题。
我有一个对象,我向其构造函数传递了工厂函数,用于制作 std::unique_ptr
另一种 class 类型的对象。
使用 VS2013,这有效:
Tester tester(
[](){return std::make_unique<AlphaBetaSingleThreadSSE>( 0,7 ); },
[](){return std::make_unique<AlphaBetaSingleThread>( 0,7 ); },
20 );
这给我编译错误:
Tester tester(
std::bind( std::make_unique<AlphaBetaSingleThreadSSE>,0,7 ),
std::bind( std::make_unique<AlphaBetaSingleThread>,0,7 ),
20 );
错误消息状态:
error C2512: 'AlphaBetaSingleThread' : no appropriate default constructor available
error C2512: 'AlphaBetaSingleThreadSSE' : no appropriate default constructor available
为什么 std::bind
方法会失败?
std::make_unique
定义如下:
§ 20.8.1.4 [unique.ptr.create]
template <class T, class... Args> unique_ptr<T> make_unique(Args&&... args);
1 Remarks: This function shall not participate in overload resolution unless
T
is not an array.2 Returns:
unique_ptr<T>(new T(std::forward<Args>(args)...)).
通过使用 std::make_unique<AlphaBetaSingleThreadSSE>
显式实例化此函数模板,您最终得到以下特化:
std::unique_ptr<AlphaBetaSingleThreadSSE> make_unique()
{
return std::unique_ptr<AlphaBetaSingleThreadSSE>(new AlphaBetaSingleThreadSSE());
}
也就是说,它不再允许您传递将转发给 AlphaBetaSingleThreadSSE
的构造函数的额外参数,而是尝试使用 AlphaBetaSingleThreadSSE
的默认构造函数(不存在,如错误消息所述)。
您可以通过同时指定类型模板参数来解决这个问题 Args
:
std::make_unique<AlphaBetaSingleThreadSSE, const int&, const int&>
但是你不会从完美转发中受益,而且这也不是一个可移植的解决方案。更好的解决方案是继续使用 lambda。