我正在使用一個數據結構,希望使用STL limits
來確定我給它的結構的最小值,最大值和無窮大(我認爲只有這些)值。我正在使用Visual C++ 2010,如果有這個東西的實現特定的細節。編譯器不識別自定義的numeric_limits成員函數
這裏是我的數據類型的基本結構,與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_type
是PseudoTuple::ReturnWrapper
一個typedef。這裏的錯誤:
error C2589: '(' : illegal token on right side of '::'
error C2059: syntax error : '::'
而且也越來越對min
和max
,這一個是在同一條線上的錯誤都使用這個有趣的警告:
warning C4003: not enough actual parameters for macro 'max'
當我使用這個數據結構的std::string
,我仍然收到這些警告,但沒有彈出編譯器錯誤。在這種情況下,它也能正常運行,所以整個事情必須以某種方式工作。但是在使用我的自定義numeric_limits
時,它不能識別max
函數。
如果我改變max()
到infinity()
,它編譯罰款,並移動到上min()
拋出一個錯誤。名字min
和max
給它一些悲傷,但我不知道爲什麼。不過,這告訴我可以從我的numeric_limits
實現中獲取infinity
方法。
編輯:刪除顯示正在傳入的類型的數據結構代碼似乎不相關。
編輯2:標記B解決了這個問題,而是一個新的彈出:
error LNK2019: unresolved external symbol "__declspec(dllimport) public: static struct PseudoTuple::ReturnWrapper __cdecl std::numeric_limits<struct PseudoTuple::ReturnWrapper>::max(void)" ([email protected][email protected]@[email protected]@@[email protected]@[email protected]@@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)" ([email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@XZ)
所以東西是搞亂鏈接...獲取同爲min
而不是infinity
。
可能的重複[我如何處理在windows.h中的'max'宏與'std'中的'max'碰撞?](http://stackoverflow.com/questions/11544073/how-do-i - 用宏達到最大宏在窗戶h - 碰撞與最大在標準) –