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)
问题是,当你调用ColorBurn
和ColorDodge
,的模板参数之一是float,另一个是双:
ColorBurn(base, (2.0 * blend))
Run Code Online (Sandbox Code Playgroud)
这里base
是浮点数,表达式2.0 * blend
是double(因为2.0
是一个双常量,所以整个表达式变为double).
现在,编译器无法决定是实例化ColorBurn
float还是double.
要解决此问题,请将常量更改为单精度浮点常量(这可能是您想要的):
ColorBurn(base, (2.0f * blend))
Run Code Online (Sandbox Code Playgroud)
同样的ColorDodge
.
请注意,如果您尝试实例化BlendVividLightf
浮动以外的其他内容,您仍然会遇到问题- 您的函数假设您处理浮点值的方式太多,因此如果您需要引入某些类型的转换希望他们为其他参数类型工作.
归档时间: |
|
查看次数: |
7131 次 |
最近记录: |