我正在使用一个数据结构,该结构想使用STL limits
来确定我提供的结构的最小值,最大值和无穷大(我认为只有这些)值。我正在使用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>
然后在此之后添加 header ,以确保它可以获取这些声明。我在这里遇到错误:
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_type
是PseudoTuple::ReturnWrapper
的类型定义。这是错误:error C2589: '(' : illegal token on right side of '::'
error C2059: syntax error : '::'
并在所有
min
和max
的所有用法上获得此有趣的警告,该警告与错误在同一行:warning C4003: not enough actual parameters for macro 'max'
当我将此数据结构与
std::array
的std::string
一起使用时,我仍然会收到这些警告,但不会 pop 编译器错误。在这种情况下,它也可以正常运行,因此整个过程必须以某种方式起作用。但是当使用我的自定义max
时,它无法识别numeric_limits
函数。如果将
max()
更改为infinity()
,它可以正常编译并继续向min()
抛出错误。名称min
和max
让它有些悲伤,但我不确定为什么。但这确实告诉我,它可以从我的infinity
实现中获取numeric_limits
方法。编辑:删除的数据结构代码显示正确的类型正在传入,似乎无关紧要。
编辑2:马克B解决了问题,但是 pop 了一个新问题:
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
却没有得到相同的结果。 最佳答案
有时min
和max
被实现为仅替换文本的宏。引起问题的不是您的专业知识,而是宏。我相信windows.h
就是这样一种违法者。您可以使用#define NOMINMAX
使其不被创建为宏。