模板参数推导问题
Issue with template argument deduction
我有一个非常简单的模板问题。
我想要一些可以处理标量和向量的数学函数。对于参数,我希望我的标量通过副本传递,而我的向量通过引用传递。
所以我最终使用了模板化的助手结构。
但是当我使用我的函数时,编译器无法自行推导模板参数。
我不知道我做错了什么,或者我应该做些什么不同的事情,或者这种做法是否从一开始就注定了^^'。
这是一个例子:
#include <type_traits>
template <typename T>
struct CopyOrConstRef
{
using Type = std::conditional_t<
std::is_scalar<T>::value,
T,
const std::remove_reference_t<T>&
>;
};
template <typename T>
using CopyOrConstRef_t = typename CopyOrConstRef<T>::Type;
template <typename T>
T Lerp(CopyOrConstRef_t<T> _a, CopyOrConstRef_t<T> _b, const float _factor)
{
return (_a * (1.f - _factor)) + (_b * _factor);
}
int main()
{
Lerp(0.f, 1.f, 0.5f); // does not work :'(
Lerp<float>(0.f, 1.f, 0.5f); // works as intended
return 0;
}
有错误信息(在 msvc 上):
error C2672: 'Lerp': no matching overloaded function found
error C2783: 'T Lerp(CopyOrConstRef<T>::Type,CopyOrConstRef<T>::Type,const float)': could not deduce template argument for 'T'
这将不起作用,因为 Lerp
的参数列表中 T
(即 CopyOrConstRef_t<T>
)的所有使用都在 non-deduced contexts:
The non-deduced contexts are:
The nested-name-specifier of a type that was specified using a qualified-id.
这是来自参考文献的 example:
Template parameters do not participate in template argument deduction if they are used only in non-deduced contexts. For example,
template<int i, typename T>
T deduce(typename A<T>::X x, // T is not deduced here
T t, // but T is deduced here
typename B<i>::Y y); // i is not deduced here
你的例子是一样的,只是没有可以推导出的参数,并且你有一个参数的别名模板(这不会改变任何东西)。
我有一个非常简单的模板问题。 我想要一些可以处理标量和向量的数学函数。对于参数,我希望我的标量通过副本传递,而我的向量通过引用传递。 所以我最终使用了模板化的助手结构。
但是当我使用我的函数时,编译器无法自行推导模板参数。 我不知道我做错了什么,或者我应该做些什么不同的事情,或者这种做法是否从一开始就注定了^^'。
这是一个例子:
#include <type_traits>
template <typename T>
struct CopyOrConstRef
{
using Type = std::conditional_t<
std::is_scalar<T>::value,
T,
const std::remove_reference_t<T>&
>;
};
template <typename T>
using CopyOrConstRef_t = typename CopyOrConstRef<T>::Type;
template <typename T>
T Lerp(CopyOrConstRef_t<T> _a, CopyOrConstRef_t<T> _b, const float _factor)
{
return (_a * (1.f - _factor)) + (_b * _factor);
}
int main()
{
Lerp(0.f, 1.f, 0.5f); // does not work :'(
Lerp<float>(0.f, 1.f, 0.5f); // works as intended
return 0;
}
有错误信息(在 msvc 上):
error C2672: 'Lerp': no matching overloaded function found
error C2783: 'T Lerp(CopyOrConstRef<T>::Type,CopyOrConstRef<T>::Type,const float)': could not deduce template argument for 'T'
这将不起作用,因为 Lerp
的参数列表中 T
(即 CopyOrConstRef_t<T>
)的所有使用都在 non-deduced contexts:
The non-deduced contexts are:
The nested-name-specifier of a type that was specified using a qualified-id.
这是来自参考文献的 example:
Template parameters do not participate in template argument deduction if they are used only in non-deduced contexts. For example,
template<int i, typename T> T deduce(typename A<T>::X x, // T is not deduced here T t, // but T is deduced here typename B<i>::Y y); // i is not deduced here
你的例子是一样的,只是没有可以推导出的参数,并且你有一个参数的别名模板(这不会改变任何东西)。