Есть несколько ошибок в этом примере , this
уже указатель. Выполнение &this
почти наверняка не то, что вы хотели сделать здесь. Другая проблема, с которой вы сталкиваетесь, заключается в том, что вы возвращаете ссылку на T
, но this
является константой в этом контексте. this->Array[Index]
- const T
, который не может связываться с T&
. Добавьте вместо этого константу и ответьте const T&
. В-третьих, this->Size
не вызывает метод Size, вы забыли скобки. Четвертая проблема - ссылка на NULL. Вам придется решить другой подход. Обычный способ указать, что операция не может быть завершена, - это выбросить исключение. std::vector::at throws std::out_of_range из заголовка stdexcept.
template <class T>
const T& Vector<T>::operator[](const int Index) const
//^^^ add const here
{
if (Index > -1 && Index < this->Size())
// Add parentheses ^^
{
return this->Array[Index];
// ^No need for &
}
else
{
throw std::out_of_range("VECTOR_INVALID_INDEX");
}
};
Вы, вероятно, хотите добавить неконстантную версию, а также, так как это будет не в состоянии на примере v[3] = 8;
. Определите этот метод также с тем же самым телом:
T& Vector<T>::operator[](const int Index);
И .. В чем же проблема с кодом, который вы опубликовали? Является ли это ошибкой компиляции на 'return NULL;'? Примечание: ссылки не могут быть равны 'NULL'. –
Типичным способом обработки этого является использование константы и неконстантной перегрузки оператора []: 'const T & Vector :: operator [] (const int Index) const;' 'T & Vector :: operator [] (const int Index); '. Вам не нужно возвращать стоимость; новая переменная типа 'int t' сможет связываться как с ссылочными, так и с возвращаемыми значениями ссылки на константу. –
0x5453
Ссылки не являются указателями, и наоборот. Нет такой вещи, как нулевая ссылка. – molbdnilo