gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:04:51 24 4
gpt4 key购买 nike

我正在使用想要使用 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_typePseudoTuple::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 ,我仍然收到这些警告,但没有弹出编译器错误。在那种情况下它也能正常运行,所以整个事情必须以某种方式工作。但它不识别 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 .

最佳答案

有时 minmax 被实现为仅替换文本的宏。造成这里问题的不是您的专业,而是宏。我相信 windows.h 就是这样的违规者。您可以使用 #define NOMINMAX 使它们不被创建为宏。

关于c++ - 编译器无法识别自定义 numeric_limits 成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12606563/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com