我可以在STL中禁用min,max吗?

P-P*_*P-P 1 c++ stl

我使用一个非常重要且不可触及的库.问题是库声明了min,max函数,所以当我在项目中包含STL头时,它们会发生冲突.我想在STL中禁用min,max函数(如#define NOMNMAX),如果可以的话.如果我不能,那将是什么解决方案?

重要提示:抱歉,这不是宏.两个函数是模板函数.

喜欢

template<T>
T min(const T& a, const T& b) { a < b ? a : b; }
Run Code Online (Sandbox Code Playgroud)

提前致谢.

小智 17

min和max函数在std命名空间中定义,因此此代码不应编译:

#include <algorithm>

int main() {
    int n = min( 1, 2 );
}
Run Code Online (Sandbox Code Playgroud)

如果是,则标准库不符合要求.此外,您重要且不可触及的库应该在命名空间中声明它的功能.如果不是.向供应商大声抱怨.

编辑:由于这些功能大概是在头文件中,您可以触摸它们.所以黑客就是从标题中删除模板并用以下内容替换它们:

using std::min;
using std::max;
Run Code Online (Sandbox Code Playgroud)

虽然为什么图书馆的作者认为需要定义这些模板是任何人的猜测.

  • 当然没有人会#define min和max.当发生冲突时,没有人会想要禁用`std :: min` /`std :: max`.如果我们只依靠开发人员来做正确的事情.;) (4认同)
  • @nikie任何声明min&max为公共可用宏的库都需要取出并拍摄.但你可能是对的. (2认同)
  • 另一种可能性是OP在某处有一个`using namespace std`. (2认同)

el.*_*ado 6

由于两者minmax(以及所有其他标准库成员)都在std命名空间中定义,因此您不能导入该命名空间,即不要使用using namespace std;.您仍然可以通过显式命名空间结果来使用STL,例如.std::max,std::cout等等.