2012-09-26 31 views
1

我試圖處理元組的數據結構,但是我需要製作一個真正從全局數據結構中提取數據的「元組」數據抓取取決於值的索引。它已經與這個簡單的設置得不錯,到目前爲止:創建一個僞元組,爲其他地方存儲數據的前端

struct PseudoTuple 
{ 
struct ReturnWrapper 
{ 
    //lots of operator overloads and fun stuff for comparisons 
} 

typedef ReturnWrapper value_type; 

//pointers to global data and various info 

static const size_t size = 9; 

ReturnWrapper operator[](int index) 
{ 
    switch (index) 
    { 
    //routing to different values 
    } 
} 
} 

template<> struct std::tr1::tuple_size<PseudoTuple> 
{ 
static const size_t value = PseudoTuple::size; 
} 

但是,我餵養想要使用std::tr1::get這些假冒的元組數據結構,和我嘗試過載已失敗:

template<int _Idx> PseudoTuple::ReturnWrapper std::tr1::get(PseudoTuple& pseudotuple) 
{ 
return pseudotuple[_Idx]; 
} 

說它「無法匹配現有的函數聲明」。 STL聲明非常混亂,我無法弄清楚問題所在。這是在Visual C++ 2010中,以防萬一。我擔心其他元組特定的函數也會被調用,但是我希望看到如何使get工作,也會告訴我如何使它們工作(如果需要的話)。

編輯:ecatmur建議將函數的命名空間:

namespace std 
{ 
namespace tr1 
{ 
    template<int _Idx> PseudoTuple::ReturnWrapper get(PseudoTuple& pseudotuple) 
    { 
    return pseudotuple[_Idx]; 
    } 
} 
} 

現在我就在我面前了,在沒有相應的獲取函數的錯誤:

error C2784: '_Arg_traits<_Get<_Idx,tuple<_Arg0,_Arg1,_Arg2,_Arg3,_Arg4,_Arg5,_Arg6,_Arg7,_Arg8,_Arg9>::_MyImpl>::_Type>::_RType std::tr1::get(std::tr1::tuple<_Arg0,_Arg1,_Arg2,_Arg3,_Arg4,_Arg5,_Arg6,_Arg7,_Arg8,_Arg9> &)' : could not deduce template argument for 'std::tr1::tuple<_Arg0,_Arg1,_Arg2,_Arg3,_Arg4,_Arg5,_Arg6,_Arg7,_Arg8,_Arg9> &' from 'const PseudoTuple' 

編輯2 :啊,定義的順序是錯誤的,我在使用它之後定義函數。我想它適用於像tuple_size但不是函數的結構。

回答

0

重載一個免費的功能,你需要在適當的命名空間提供一個定義:

namespace std { 
    namespace tr1 { 
     template<int _Idx> PseudoTuple::ReturnWrapper get(PseudoTuple& pseudotuple) 
     { 
      return pseudotuple[_Idx]; 
     } 
     template<int _Idx> ... get(const PseudoTuple &pseudotuple) 
     { 
      return ...; 
     } 
     template<int _Idx> ... get(PseudoTuple &&pseudotuple) 
     { 
      return ...; 
     } 
    } 
} 

注意,這是每17.6.4.2.1 [namespace.std]未定義的行爲;您允許添加到std或包含的名稱空間的唯一代碼對象是用戶定義的類的模板特化。但是,當前標準應該沒問題,因爲所有參數都是用戶定義的類型,並且與標準定義的代碼對象沒有衝突。

+0

它適用於'tuple_size'就好,儘管它不是一個函數。您的解決方案取代了我目前獲得的錯誤,當時我根本沒有get功能。我將編輯將它放在主帖子中。 – user173342

+0

@ user173342您需要提供const引用和(如果適用)右值引用重載。 – ecatmur

相關問題