【问题标题】:Overloading () operator for std::array gives: error C2039: '()' : is not a member of 'std::array<_Ty,_Size>'std::array 的重载 () 运算符给出:错误 C2039: '()' : is not a member of 'std::array<_Ty,_Size>'
【发布时间】:2013-07-12 22:20:20
【问题描述】:

我有一段代码如下所示:

std::array<CPlayer,MAX_PLAYERS> Player;
#define Player(playerid) Player[playerid]

然后按如下方式使用它:

Player(id).SomeMethod(some params);

但是定义很丑陋,我想尽可能地保留它的 C++ 方式,并且 std::array 确实有 [] 运算符但没有 () 运算符,所以我尝试添加这个:

template < class T, size_t N > T& std::array<T, N>::operator()(int index)
{
    return this->at(index);
}

但它给了我以下错误:

error C2039: '()' : is not a member of 'std::array<_Ty,_Size>'

对此我能做些什么?我一无所知。

【问题讨论】:

  • 为什么不能直接使用operator []
  • 如果你想让它尽可能像 C++,使用正确的索引操作符!
  • #define Player(playerid) Player[playerid] 这样做的唯一目的是将( 更改为[ 吗?有点浪费时间写...

标签: c++ arrays c++11 operator-overloading


【解决方案1】:

在定义类后,无法向其添加新成员(函数或变量)。

我个人认为,如果它是一个数组,使用 player[id].SomeMethod(some params); 和你的建议一样好。

【讨论】:

  • 并且不允许为标准库重载运算符,即使它们不必是成员。那个是双重打击。
【解决方案2】:

假设您只想使用函数调用() 语法(并且没有其他方式)访问数组,您可以将其隐藏为函数中的局部静态变量:

CPlayer& Player(size_t i)
{
    static std::array<CPlayer,MAX_PLAYERS> PlayerArray;
    return PlayerArray[i];
}

但不知道你对下标[] 表达式有什么看法。

【讨论】:

  • 我没有反对它,只是看起来更好看xD
猜你喜欢
  • 2011-03-08
  • 2021-10-25
  • 2014-07-17
  • 1970-01-01
  • 2015-01-14
  • 2012-12-10
  • 1970-01-01
  • 2019-12-06
  • 1970-01-01
相关资源
最近更新 更多