[英]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>
)的所有使用都在非推導上下文中:
非推導的上下文是:
使用限定 ID 指定的類型的嵌套名稱說明符。
這是參考資料中的一個例子:
如果模板參數僅在非推導上下文中使用,則模板參數不參與模板參數推導。 例如,
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
你的例子是一樣的,除了沒有可以推導出的參數,並且你有一個參數的別名模板(它不會改變任何東西)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.