我正在尝试使用处理元组的数据结构,但是我需要创建一个真正从全局数据结构中提取数据的“元组”,获取的数据取决于值的索引。到目前为止,它通过这个简单的设置运行得相当好:
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];
}
}
}
现在,当没有适当的 get 函数时,我遇到了以前的错误:
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
但不适用于函数。