编译器无法识别自定义numeric_limits成员函数

时间:2012-09-26 16:46:12

标签: c++ templates stl compiler-errors numeric-limits

我正在使用一个想要使用STL limits的数据结构来确定我给它的结构的min,max和infinity(我认为只有这些)值。我正在使用Visual C ++ 2010,如果有针对这些内容的实现特定细节。

以下是我的数据类型的基本结构,PseudoTuple::ReturnWrapper是需要限制支持的类型:

struct PseudoTuple
{
 struct ReturnWrapper
 {
  //wraps return values for comparisons and such
 }

 typedef ReturnWrapper value_type;

 //basic "tuple" implementation as a data front
}

凭借复制和粘贴的强大功能,我为它创建了一个小的numeric_limits类,只实现了我认为需要的3个函数。返回值目前是临时的,只是为了看看它是否会编译。

namespace std
{
 template<> class _CRTIMP2_PURE numeric_limits<PseudoTuple::ReturnWrapper>
  : public _Num_int_base
 {
 public:
  typedef PseudoTuple::ReturnWrapper _Ty;

  static _Ty (__CRTDECL min)() _THROW0()
  { // return minimum value
   return PseudoTuple::ReturnWrapper();
  }

  static _Ty (__CRTDECL max)() _THROW0()
  { // return maximum value
   return PseudoTuple::ReturnWrapper();
  }

  static _Ty __CRTDECL infinity() _THROW0()
  { // return positive infinity
   return PseudoTuple::ReturnWrapper();
  }
 };
}

#include <data structure using PseudoTuple>

我在此之后包含标题以确保它可以获取这些声明。我在这里收到错误:

namespace detail {

 template<typename coordinate_type, bool is_integer, bool has_infinity>
 struct coordinate_limits_impl;

 template<typename coordinate_type>
 struct coordinate_limits_impl<coordinate_type, true, false> {
  static const coordinate_type highest() {
   return std::numeric_limits<coordinate_type>::max(); // --- error here ---
  }
  static const coordinate_type lowest() {
   return std::numeric_limits<coordinate_type>::min();
  }
 };

//lots of stuff

}

coordinate_typePseudoTuple::ReturnWrapper的typedef。这是错误:

error C2589: '(' : illegal token on right side of '::'
error C2059: syntax error : '::'

并且对minmax的所有用法发出了这个有趣的警告,这个与错误位于同一行:

warning C4003: not enough actual parameters for macro 'max'

当我使用std::array std::string的{​​{1}}数据结构时,我仍会收到这些警告,但不会弹出编译器错误。在这种情况下它也可以正常运行,因此整个过程必须以某种方式工作。但在使用我的自定义max时,它无法识别numeric_limits函数。

如果我将max()更改为infinity(),它会很好地编译并继续在min()上抛出错误。名字minmax给了它一些悲伤,但我不确定为什么。这确实告诉我它可以从infinity的实现中获取numeric_limits方法。

编辑:删除了显示正确类型的数据结构代码,似乎无关紧要。

编辑2:Mark B解决了问题,但是弹出了一个新问题:

error LNK2019: unresolved external symbol "__declspec(dllimport) public: static struct PseudoTuple::ReturnWrapper __cdecl std::numeric_limits<struct PseudoTuple::ReturnWrapper>::max(void)" (__imp_?max@?$numeric_limits@UReturnWrapper@PseudoTuple@@@std@@SA?AUReturnWrapper@PseudoTuple@@XZ) referenced in function "public: static struct PseudoTuple::ReturnWrapper const __cdecl kd_v1_0_8::spatial::detail::coordinate_limits_impl<struct PseudoTuple::ReturnWrapper,1,0>::highest(void)" (?highest@?$coordinate_limits_impl@UReturnWrapper@PseudoTuple@@$00$0A@@detail@spatial@kd_v1_0_8@@SA?BUReturnWrapper@PseudoTuple@@XZ)

所以有些事情搞乱了链接......为min而不是infinity获取相同内容。

1 个答案:

答案 0 :(得分:1)

有时候,minmax被实现为只替换文本的宏。这不是你的专业化导致问题,而是宏。我相信windows.h就是这样一个罪犯。您可以使用#define NOMINMAX使其不能创建为宏。