2012-09-26 96 views
1

我正在使用一個數據結構,希望使用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_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::string,我仍然收到這些警告,但沒有彈出編譯器錯誤。在這種情況下,它也能正常運行,所以整個事情必須以某種方式工作。但是在使用我的自定義numeric_limits時,它不能識別max函數。

如果我改變max()infinity(),它編譯罰款,並移動到上min()拋出一個錯誤。名字minmax給它一些悲傷,但我不知道爲什麼。不過,這告訴我可以從我的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

+1

可能的重複[我如何處理在windows.h中的'max'宏與'std'中的'max'碰撞?](http://stackoverflow.com/questions/11544073/how-do-i - 用宏達到最大宏在窗戶h - 碰撞與最大在標準) –

回答

1

有時minmax被實現爲只替換文本的宏。這不是你的專業化問題,而是宏觀問題。我相信windows.h就是這樣一個罪犯。您可以使用#define NOMINMAX使它們不被創建爲宏。

+0

好的電話,但顯然我的專業化並不那麼了不起。現在獲取鏈接器錯誤。粘貼到此框太長,我已將它編輯到上面的OP末尾。 – user173342

相關問題