C++ 错误C2782:&x27;康斯特;标准:最小(常数、常数)和模板参数'_Ty';含糊不清
我正在为64位构建软件,以前是为32位构建的软件。当我为64位构建软件时,软件完全可以为32位工作,这会产生一些错误,比如C++ 错误C2782:&x27;康斯特;标准:最小(常数、常数)和模板参数'_Ty';含糊不清,c++,templates,C++,Templates,我正在为64位构建软件,以前是为32位构建的软件。当我为64位构建软件时,软件完全可以为32位工作,这会产生一些错误,比如 error C2782: 'const _Ty &std::min(const _Ty &,const _Ty &)' : template parameter '_Ty' is ambiguous see declaration of 'std::min' could be 'size_t' or 'un
error C2782: 'const _Ty &std::min(const _Ty &,const _Ty &)' : template parameter '_Ty' is ambiguous
see declaration of 'std::min'
could be 'size_t'
or 'unsigned int'
排队
unsigned int i = ...;
unsigned int maxPeakWidthInPixel = ...;
size_t steps = ...;
unsigned int endj = min( i + maxPeakWidthInPixel + 1, steps); // error
错误在于编译器无法推断参数的类型-但是如何在32位而不是64位上编译?两个参数中的一个是
size\u t
,另一个是unsigned int
。在32位平台上,这两种类型相同,因此没有问题
在64位平台上,它们是不同的类型,min()
模板要求两个参数具有相同的类型,这是您的问题
无论哪个参数是无符号int
,都将其显式转换为size\u t
。这可能是第一个:
unsigned int endj = min( (size_t)(i + maxPeakWidthInPixel + 1), steps);
但如果不是,则将另一个转换为
size\t
。明确指定模板类型以解决歧义
min<size_t>(...);
min(…);
在您所在的平台上,size\u t
不是unsigned int
。因此,类型推断机制无法知道要执行哪个模板实例化
或者,您可以简单地避免混合类型,并根据
size\u t
或unsigned int
执行所有操作。无论哪一个是适合您特定应用的首选项。我们可以查看代码吗?变量i、maxpakwidth和stepsit的声明意味着您有混合类型,即i
、maxpakwidthinpixel
和steps
。类型需要一致才能使模板化代码生成什么类型的maxpakwidthinpixel
和steps
?我猜这是因为size\u t==unsigned int
在32位,而size\u t==unsigned long
在64位。因此,此错误消息是由参数类型引起的。但是您没有显示参数的声明。当然变量endj
也应该是size\u t
(或者只是auto
)类型。我想说,在您的32位平台上,这两种类型是相同的,所以没有问题。。标准对大小没有任何保证,除了它是无符号的,并且它足够大,可以包含任何对象的大小(以字节为单位)!谢谢,我将endj保留为unsigned int。您还可以显式指定模板类型,并避免那些c样式转换。谢谢,这正是我所需要的。