c++模板参数不明确
c++ template parameter is ambiguous
我试图实现三个函数,但有很多错误,所有这些错误都有相同的签名:
error C2782: 'T0 ColorBurn(T0,T0)' : template parameter 'T0' is ambiguous
error C2782: 'T1 ColorDodge(T1,T1)' : template parameter 'T1' is ambiguous
我哪里搞错了
这是我的代码:
template <class T0>
T0 ColorBurn(T0 base, T0 blend)
{
return (blend == 0.0) ? blend : std::max((1.0 - ((1.0 - base) / blend)), 0.0);
}
template <class T1>
T1 ColorDodge(T1 base, T1 blend)
{
return (blend == 1.0) ? blend : std::min(base / (1.0 - blend), 1.0);
}
template <class T>
T BlendVividLightf(T base, T blend)
{
return (blend < 0.5) ? ColorBurn(base, (2.0 * blend)) : ColorDodge(base, (2.0 * (blend - 0.5)));
}
调用BlendVividLightf:的示例
static pixel_t blend_vivid_light(pixel_t _p1, pixel_t _p2)
{
pixel_t po;
po.r = BlendVividLightf(_p1.r, _p2.r);
....
}
pixel_t - is my struct for rgb values:
typedef struct
{
float r;
float g;
float b;
} pixel_t;
问题是,当您调用ColorBurn
和ColorDodge
时,其中一个模板参数是float,另一个是double:
ColorBurn(base, (2.0 * blend))
这里,base
是浮点,表达式2.0 * blend
是二重(因为2.0
是二重常数,所以整个表达式变为二重)。
现在,编译器无法决定是为float还是为double实例化ColorBurn
。
要解决这个问题,请将常量更改为单精度浮点常量(这可能是您想要的):
ColorBurn(base, (2.0f * blend))
对于CCD_ 7也是类似的。
请注意,如果您尝试为float以外的东西实例化BlendVividLightf
,仍然会遇到问题——您的函数在很多方面都假设您在处理浮点值,因此如果您希望它们适用于其他参数类型,则必须引入一些类型转换。
问题的原因是0.5
是一个double
文本,而T0
是一个浮点。因此,您要向模板传递两个不同类型的参数,因此编译器无法决定使用哪一个。有两种解决方案:
- 将
0.5
更改为0.5f
,使其成为float
文字 -
为模板提供显式的类型参数,例如:
ColorBurn<float>(base, (2.0 * blend))
也许您必须将(2.0*blend)的结果强制转换为"T"并将其传递给ColorBurn。。。例如:
ColorBurn(base, static_cast<T>(2.0 * blend));
我可以猜测,问题是由于float
和double
不匹配造成的。在所有3个函数中,您正在生成(强制)相同类型T0/T1/T
的两个template
参数。因此,当您使用float
调用函数时,它将出现问题。请在此处查看演示。
这可以通过将pixel_t
成员设置为double
而不是float
来解决。
您的问题在这一行:
ColorBurn(base, (2.0 * blend)) ...
在这里,literal 2.0将强制将第二个参数转换为double
,但是,由于第一个参数是它的原始模板类型,并且在稍后的代码中它是float
,编译器无法推断您是要调用ColorBurn<double>
还是ColorBurn<float>
(这一行稍后对ColorDodge
的调用也是如此)。
您可以通过以下任一方式修复错误:
- 在函数调用中显式告诉编译器模板参数
- 也强制转换为第一个参数的两倍,例如
... * 1.0
- 将第二个参数中的双字面值更改为浮动字面值,例如
... * 2.0f
- 为float和double编写专门化或单独的重载,并在上面进行适当的更改,以确保两个参数的类型相同
- 为函数定义符号不明确的指针参数
- 父类的私有函数会导致对具有相同名称和相似参数的子类中的公共函数的不明确调用
- 对函数的重新定义和不明确的调用具有数组参数
- 函数模板和不明确的模板参数
- 编译器确定不明确的参数
- 重载调用是不明确的:一对内联映射作为构造函数参数
- 如果存在具有不同参数的继承成员,为什么对 C++ 结构函数的调用不明确?
- C++具有可变参数包的函数的部分模板参数推导会在 Clang 和 MSVC 中产生不明确的调用
- 不明确的可变参数类成员访问
- 不明确的重载函数仅在参数的模板参数上有所不同
- 递归调用可变参数模板函数重载时的不明确调用
- 对没有参数的可变参数模板函数的不明确调用
- 解决模板参数推导中的不明确调用
- 可变函数指针参数的模板参数推导-处理不明确的情况
- 64 位C++传递具有"不同"调用约定作为参数的函数会产生不明确的错误
- SFINAE:如果在没有参数的情况下调用,则重载不明确
- 模板参数推导,案例不明确
- 使用可变模板参数传递成员函数指针是不明确的
- 错误 C2782:"常量_Ty &std::min(常量 _Ty &,常量_Ty &)":模板参数"_Ty"不明确
- 依赖类型不明确的 c++11 可变参数函数模板重载是否不明确