c ++模板参数不明确

Pap*_*ohn 1 c++ templates compiler-errors type-mismatch

我正在尝试实现三个函数并且有很多错误,所有错误都具有相同的签名:

error C2782: 'T0 ColorBurn(T0,T0)' : template parameter 'T0' is ambiguous
error C2782: 'T1 ColorDodge(T1,T1)' : template parameter 'T1' is ambiguous
Run Code Online (Sandbox Code Playgroud)

哪里弄错了?
这是我的代码:

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)));
}
Run Code Online (Sandbox Code Playgroud)

调用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;
Run Code Online (Sandbox Code Playgroud)

Mar*_*n B 9

问题是,当你调用ColorBurnColorDodge,的模板参数之一是float,另一个是双:

ColorBurn(base, (2.0 * blend))
Run Code Online (Sandbox Code Playgroud)

这里base是浮点数,表达式2.0 * blend是double(因为2.0是一个双常量,所以整个表达式变为double).

现在,编译器无法决定是实例化ColorBurnfloat还是double.

要解决此问题,请将常量更改为单精度浮点常量(这可能是您想要的):

ColorBurn(base, (2.0f * blend))
Run Code Online (Sandbox Code Playgroud)

同样的ColorDodge.

请注意,如果您尝试实例化BlendVividLightf浮动以外的其他内容,您仍然会遇到问题- 您的函数假设您处理浮点值的方式太多,因此如果您需要引入某些类型的转换希望他们为其他参数类型工作.