Учитывая указатель на объект C ++, каковы все правильные способы вызова функции operator []? - PullRequest
3 голосов
/ 10 февраля 2012

Я пишу изменяющийся во времени класс профиля с использованием шаблонов и хочу индексировать профиль либо по числовому индексу, либо по дате и времени, как это представлено в структуре tm. Индексация по числовому индексу работает нормально, но индексация по дате не работает с указателем на объект. Вот пример кода, который содержит подходы, которые работают, и подходы, которые не работают.

#include "profile.h" // Class Profile<T> is declared and defined here.
float f;
int i;
struct tm d;
Profile<float> p;
Profile<float> *pPtr;

// Non-pointer syntax
f = p[i];                // this works.
f = p.operator[](i);     // this works, but its ugly.
f = p[d];                // this works.
f = p.operator[](d);     // this works, but its ugly.

// Pointer syntax
f = (*pPtr)[i];          // this works.
f = pPtr->operator[](i); // this works, but its ugly.
f = (*pPtr)[d];          // this isn't what I typed.  I did f = *(pPtr)[d];
f = pPtr->operator[](d); // this works, but its ugly.

Этот код C ++ пишется в Visual Studio 2008. Сообщение об ошибке компилятора является ошибкой C2677 двоичного файла '[': глобальный оператор не найден, который принимает тип 'tm' (или нет приемлемого преобразования).

Учитывая указатель на объект C ++, каковы все правильные способы вызова функции operator []?

Ответы [ 3 ]

2 голосов
/ 11 февраля 2012

Код, который вы показали здесь, в порядке; вероятно, в ваших предыдущих попытках вы делали *(pPtr)[d] вместо (*pPtr)[d], что, по понятным причинам, могло вызвать ошибку, поскольку operator* имеет более низкий приоритет, чем operator[].

1 голос
/ 10 февраля 2012

Вы перечислили разумные варианты. Я не понимаю, почему разыменование указателя не будет работать. Следующие компиляции просто отлично:

std::vector<int> v;
v.push_back(0);
v[0];

std::vector<int>* vp = &v;
(*vp)[0];
0 голосов
/ 11 февраля 2012

В подобных случаях я добавляю дополнительный метод в класс, например, 'at'.

templateType & Profile::at(int idx) 
{
    return operator[](idx);
}

Итак, код выглядит лучше:

f = pPtr->at(i); 

Кстати, использовать at (idx) в методах класса (в нашем случае это профиль) было бы легко, если бы operator[](idx).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...