Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 错误C2782:&x27;康斯特;标准:最小(常数、常数)和模板参数'_Ty';含糊不清_C++_Templates - Fatal编程技术网

C++ 错误C2782:&x27;康斯特;标准:最小(常数、常数)和模板参数'_Ty';含糊不清

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

我正在为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       '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样式转换。谢谢,这正是我所需要的。