微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

模板参数推导问题

如何解决模板参数推导问题

我有一个非常简单的模板问题。 我想拥有一些可用于标量和向量的数学函数。对于参数,我希望标量通过副本传递,矢量通过引用传递。 因此,我最终使用了模板化的辅助结构。

但是当我使用函数时,编译器无法自行推断模板参数。 我不知道自己做错了什么,应该做些什么,或者这种方法是否注定要从一开始就^^'。

这里是一个例子:

#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,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'

解决方法

这是行不通的,因为T的参数列表中CopyOrConstRef_t<T>(它们是Lerp)的所有用法都在non-deduced contexts中:

非推论上下文是:

使用限定ID指定的类型的嵌套名称说明符。


以下是参考文献中的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

您的示例是相同的,只是没有可以推论的参数,并且您有一个参数的别名模板(不会更改任何内容)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?