代码在stlport_shared上编译好,但在gnustl_shared上编译

时间:2014-09-12 18:48:23

标签: c++ c++11 android-ndk

namespace MN{
  template<class _Kn> inline const _Kn& max(const _Kn& _M, const _Kn& _N)
    {return (_M < _N ? _N : _M); }
}

当我有APP_STL:= stlport_shared时,上面的代码编译得很好但是当我设置APP_STL:= gnustl_shared时,它会失败并显示以下消息。

  

错误:在第2行的数字常量之前预期','或'...'   在函数'const _Kn&amp; MN :: max(const _Kn&amp;)':错误:'_N'未在此范围内声明。

不是c ++极客,请帮忙

1 个答案:

答案 0 :(得分:3)

_开头的名称和大写字母保留给编译器,标准库和STL内部详细信息。根据错误消息,看起来gnustl已将_M定义为一个宏,正在扩展到您不想要的东西。请注意,错误消息中的函数原型缺少第二个参数,该参数暗示预处理器正在将_M转换为其他参数。

通常,您可以通过从不使用以下划线开头的任何名称来避免这些问题。如果您重命名它们以省略下划线,您应该会看到问题消失。

template<class Kn> inline const Kn& max(const Kn& M, const Kn& N)
  {return (M < N ? N : M); }

进一步阅读:What are the rules about using an underscore in a C++ identifier?