我使用一个非常重要且不可触及的库。 问题是库声明了min,max函数, 所以当我在项目中包含STL标题时,它们会发生冲突。 我想在STL中禁用min,max函数(如#define NOMNMAX),如果可以的话。 如果我不能,那将是什么解决方案?
重要: 对不起,这不是宏。两个函数是模板函数。
像
template<T>
T min(const T& a, const T& b) { a < b ? a : b; }
提前谢谢。
答案 0 :(得分:17)
min和max函数在std
命名空间中定义,因此不应编译此代码:
#include <algorithm>
int main() {
int n = min( 1, 2 );
}
如果是,则标准库不符合要求。此外,您重要且不可触及的库应该在命名空间中声明它的功能。如果不是。向供应商大声抱怨。
编辑:由于这些功能可能位于头文件中,因此您可以触摸它们。所以黑客就是从标题中删除模板并用以下内容替换它们:
using std::min;
using std::max;
虽然为什么图书馆的作者认为需要定义这些模板是任何人的猜测。
答案 1 :(得分:6)
由于min
和max
(以及所有其他标准库成员)都在std
命名空间中定义,因此您不能导入该命名空间,即不要使用{{ 1}}。您仍然可以通过显式命名空间结果来使用STL,例如。 using namespace std;
,std::max
等。
答案 2 :(得分:3)
如果您的不可触摸的库不在命名空间中,您可以强制查找使用全局范围,而不是标准:
int i = ::min<int>(1,2);
更好的解决方案是删除
using namespace std
并将您的库放在命名空间中。
答案 3 :(得分:2)
我有时也会遇到类似的问题,因为iirc OpenCV #defines自己的min / max,以及我认为是windows.h。 通常我只需要帮助自己
#undef min
#undef max
但是,Neil是正确的,因为min在std :: namespace中。对我来说问题出现了,有些标题#defining min / max,我甚至不能使用std :: min()
答案 4 :(得分:1)
定义NOMINMAX
,您将无法获得这些功能。
#define NOMINMAX
答案 5 :(得分:-2)
我猜你的libary将min / max定义为宏,因此STL min / min在命名空间中的事实无济于事。你可以试试这个:
#define max STL_MAX
#define min STL_MIN
#include <algorithm>
#undef min
#undef max
这样,在编译算法时,min和max被转换为其他内容。当然,只有在库之前包含算法时,这才有效。