关于TensorRT的若干报错问题
- 问题一
unsigned int worst_score = std::numeric_limits<unsigned int>::max();严重性 代码 说明 项目 文件 行 禁止显示状态
错误 C2589 “(”:“::”右边的非法标记 EngineInforence1 D:\OpenCV\opencv346\build\include\opencv2\flann\lsh_index.h 204
解决办法
UniqueResultSet() :is_full_(false), worst_distance_((std::numeric_limits<DistanceType>::max)()) // <-- 注意 max() 外的括号
{
}
- 问题 2
error:“ACCESS_MASK”: 不明确的符号
解决办法
注释掉所有的命名空间 如using namespce cv, using namespce std;
- 问题3
`C2589: "(":"::"右边的非法标记` 表明在预处理阶段,代码 `std::max(...)` 被意外修改了,导致语法不正确。
为什么 std::max
仍然不行?
NOMINMAX
未定义或定义太晚: 你可能没有在包含windows.h
之前定义NOMINMAX
,或者定义的位置不对,导致max
宏仍然被定义。- 其他库定义了
max
宏: 可能有其他第三方库也定义了max
宏。 - 项目范围的宏定义:
max
可能在项目设置中被强制定义了。
解决方法:
-
(强烈推荐)确保
NOMINMAX
正确且及时定义:- 这是最根本的解决方案。你需要确保在 任何 可能包含定义
max
/min
宏的头文件(尤其是windows.h
)之前,定义NOMINMAX
。 - 最佳实践是在项目属性中全局定义它:
- 在 Visual Studio 中,右键点击你的项目
EngineInforence1
-> 属性 (Properties)。 - 转到 配置属性 (Configuration Properties) -> C/C++ -> 预处理器 (Preprocessor)。
- 在 预处理器定义 (Preprocessor Definitions) 中添加
NOMINMAX
。也建议同时添加WIN32_LEAN_AND_MEAN
。 - 确保这对所有配置(Debug/Release)和平台(x86/x64)都应用了。
- 在 Visual Studio 中,右键点击你的项目
- 如果不能修改项目属性,或者需要在特定文件中处理:
- 找到包含
lsh_table.h
的.cpp
文件。 - 在该
.cpp
文件的最顶部(在任何#include
之前)添加:#define NOMINMAX #define WIN32_LEAN_AND_MEAN // 然后包含其他头文件 #include <windows.h> // 如果需要 #include <opencv2/.../lsh_table.h> // ... 其他 includes ...
- 找到包含
- 这是最根本的解决方案。你需要确保在 任何 可能包含定义
-
(替代方案)使用括号包围
std::max
:- 即使定义了
NOMINMAX
,如果因为某些原因max
宏仍然存在(例如在某个特定上下文中被重新定义),这个方法也能提供额外的保护。 - 修改
lsh_table.h
第 301 行的代码:// 原代码 // if (((std::max(buckets_space_.size(), buckets_speed_.size()) * CHAR_BIT * 3 * sizeof(BucketKey)) / 10 // >= (size_t(1) << key_size_)) || (key_size_ <= 32)) {// 修改后,注意 std::max 外的括号 if (((std::max)(buckets_space_.size(), buckets_speed_.size()) * CHAR_BIT * 3 * sizeof(BucketKey)) / 10>= (size_t(1) << key_size_)) || (key_size_ <= 32)) {// ... rest of the code ... }
std::max
外的括号()
阻止了宏替换,明确告诉编译器这是一个函数调用。
- 即使定义了