模板参数 deduction/substitution 因 Boost Hana type_c 而失败
Template argument deduction/substitution failed with Boost Hana type_c
我不明白为什么下面这个简单的例子失败了:
#include <boost/hana.hpp>
template <typename _T>
static constexpr void Foo(boost::hana::type<_T>) {
}
int main() {
Foo(boost::hana::type_c<int>);
return 0;
}
我收到以下错误消息:
[build] error: no matching function for call to ‘Foo(boost::hana::type<int>&)’
[build] 74 | Foo(hana::type_c<int>);
[build] | ~~~^~~~~~~~~~~~~~~~~~~
[build] note: candidate: ‘template<class _T> constexpr void Morphy::Foo(boost::hana::type<T>)’
[build] 61 | static constexpr void Foo(hana::type<_T>) {
[build] | ^~~
[build] note: template argument deduction/substitution failed:
[build] note: couldn’t deduce template parameter ‘_T’
[build] 74 | Foo(hana::type_c<int>);
[build] | ~~~^~~~~~~~~~~~~~~~~~~
完成上述工作的唯一方法是通过编写 Foo<int>(boost::hana::type_c<int>)
显式显示 Foo
的模板参数。 为什么编译器无法自动推导模板参数?
请注意,如果我在 Foo
的声明中使用 boost::hana::basic_type
代替 boost::hana::type
,则上述代码有效。 这种替代方法是否正确?
type_c<int>
是一个变量模板,它创建一个 type<int>
类型的值。看起来 Foo
在传递 type<int>
时应该很容易从 type<_T>
推导出参数 _T
。然而,这是不可能的,因为 type
是一个别名模板,它引用了一些辅助 class 的成员,并且它的参数总是在非推导上下文中。
template< typename x_Type >
struct FooImpl
{
using Type = x_Type;
};
template< typename x_Type >
using Foo = typename FooImpl<x_Type>::Type;
template< typename x_Type > // x_Type can not be deduced
void Bar(Foo<x_Type>) {}
int main()
{
Bar(Foo<int>{});
return 0;
}
basic_type
有效,因为它是 type_c
.
的实际类型
我不明白为什么下面这个简单的例子失败了:
#include <boost/hana.hpp>
template <typename _T>
static constexpr void Foo(boost::hana::type<_T>) {
}
int main() {
Foo(boost::hana::type_c<int>);
return 0;
}
我收到以下错误消息:
[build] error: no matching function for call to ‘Foo(boost::hana::type<int>&)’
[build] 74 | Foo(hana::type_c<int>);
[build] | ~~~^~~~~~~~~~~~~~~~~~~
[build] note: candidate: ‘template<class _T> constexpr void Morphy::Foo(boost::hana::type<T>)’
[build] 61 | static constexpr void Foo(hana::type<_T>) {
[build] | ^~~
[build] note: template argument deduction/substitution failed:
[build] note: couldn’t deduce template parameter ‘_T’
[build] 74 | Foo(hana::type_c<int>);
[build] | ~~~^~~~~~~~~~~~~~~~~~~
完成上述工作的唯一方法是通过编写 Foo<int>(boost::hana::type_c<int>)
显式显示 Foo
的模板参数。 为什么编译器无法自动推导模板参数?
请注意,如果我在 Foo
的声明中使用 boost::hana::basic_type
代替 boost::hana::type
,则上述代码有效。 这种替代方法是否正确?
type_c<int>
是一个变量模板,它创建一个 type<int>
类型的值。看起来 Foo
在传递 type<int>
时应该很容易从 type<_T>
推导出参数 _T
。然而,这是不可能的,因为 type
是一个别名模板,它引用了一些辅助 class 的成员,并且它的参数总是在非推导上下文中。
template< typename x_Type >
struct FooImpl
{
using Type = x_Type;
};
template< typename x_Type >
using Foo = typename FooImpl<x_Type>::Type;
template< typename x_Type > // x_Type can not be deduced
void Bar(Foo<x_Type>) {}
int main()
{
Bar(Foo<int>{});
return 0;
}
basic_type
有效,因为它是 type_c
.