是否可以在类定义之外定义operator []()(数组预订)?

时间:2014-02-24 07:44:32

标签: c++

根据this post

  

数组订阅运算符是二元运算符,必​​须作为类成员实现。

然后它提供了一个例子:

class X {
        value_type& operator[](index_type idx);
  const value_type& operator[](index_type idx) const;
  // ...
};

是否可以将此运算符定义为类定义之外的成员?

1 个答案:

答案 0 :(得分:2)

是的,您可以将其声明为类并将其定义为另一个翻译单元(或相同的单元),如下所示

<强>的main.cpp

#include <iostream>
using namespace std;

class myClass {
    public:

    int operator[](int idx);
};

// Definition outside of the class
int myClass::operator[](int idx) {
    return 42;
}

int main() {
    myClass obj;

    cout << obj[55];

    return 0;
}

或类似以下内容

<强>的main.cpp

#include <iostream>
#include "header.h" <--
using namespace std;

int main() {
    myClass obj;

    cout << obj[55];

    return 0;
}

<强> header.h

#pragma once

class myClass {
    public:

    int operator[](int idx);
};

<强> header.cpp

#include "header.h"

// Definition outside of the class
int myClass::operator[](int idx) {
    return 42;
}

请记住ODR - One Definition Rule:在任何翻译单元中,模板,类型,对象或函数的定义不得超过一个。