【问题标题】:Template Operator []=模板运算符 []=
【发布时间】:2011-10-06 14:45:08
【问题描述】:

作为一个练习,我正在制作一个模板 Array 类,我想执行此操作:

Array<int> a[5];

a[4] = 2;

这样的东西怎么写?
我试过了:

template<class T> class Array{
...
T operator[(const int loc)]=(const T temp);

【问题讨论】:

  • 仅供参考,首选做法是在转换为模板之前完全编写具体类。
  • 模板在这里并不重要。这是一个关于如何重载op[]的问题。

标签: c++ class templates operator-keyword


【解决方案1】:

您编写了一个operator [],它返回对该元素的引用。作为参考,可以通过=分配给它。

template <typename T>
class Array {
    …
    T& operator [](unsigned int const loc) {
        …
    }
};

(参数中的const 不常用,但请继续在函数定义中使用它 - 但是,在其声明中没有任何意义。)

您通常需要另一个版本运算符const,以便您仍然可以读取来自const 数组的值:

Array<int> x;
Array<int> const& y = x;

std::cout << y[0]; // Won’t compile!

要编译最后一行,请将以下代码添加到您的类中:

T const& operator [](unsigned int const loc) const {
    …
}

请注意,返回值和函数本身都标记为const

【讨论】:

  • 谢谢,有没有办法像我上面试过的那样制作一个带有 2 个参数的运算符?
  • @TaruStolovich 没有。但不需要。
  • @Taru:没有办法在 C++ 中创建 []= 运算符。您不能创建新的运算符,也不能更改关联性或优先级。您只需赋予现有含义新的含义。
  • 'loc' 参数上的 const 修饰符有什么作用?我的猜测是什么:-)
  • @Martin 它使参数在函数本身内不可修改。我更喜欢将 all 设为我的变量 const(循环变量和少数其他异常除外),只是为了让编译器立即捕获错误的赋值。我通常从不修改变量,我转换它们,创建新变量来保存结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-15
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-01
相关资源
最近更新 更多