Я возился с указателем на вектор указателей
std::vector<int*>* MyVector;
К которому я пытаюсь получить доступ, используя эти 2 метода:
MyVector->at(i); //This works
MyVector[i] //This says "Expression must be a pointer to a complete object type"
Насколько я понимаю, разница между методами векторов [] operator и at заключается в том, что метод at выполняет дополнительные проверки границ, поэтому мой вопрос: почему метод at успешно получает доступ к элементу, а [] operator - нет?
Обновлено:
Весь код здесь
#include <vector>
#include <iostream>
std::vector<int*>* MyVector;
int main()
{
MyVector = new std::vector<int*>;
MyVector->push_back(new int(5));
for (unsigned int i = 0; i < MyVector->size(); i++)
{
delete MyVector->at(i); //This works
delete MyVector[i]; //This says "Expression must be a pointer to a complete object type
}
system("pause");
}





Проблема в том, что вы объявили указатель на вектор. Во втором выражении вы эффективно обрабатываете MyVector как массив, в котором вы пытаетесь получить доступ к элементу i-го типа std::vector<int*> (который, как я полагаю, не существует).
MyVector - это указатель на вектор, а не вектор.
Два решения:
Поскольку MyVector является указателем, вам необходимо разыменовать указатель
первым получил обратно vector.
(*MyVector)[i]
Менее используется: используйте ключевое слово operator:
MyVector->operator[](i)
@Vishuu, at и [] делают то же самое, но at дополнительно выполняет проверку границ и выдаст исключение, если вы попытаетесь получить доступ к памяти за пределами границ. Это единственная разница
О да. При более внимательном чтении теперь я вижу, что метод at возвращает ссылку на n-ю позицию вектора, тогда как оператор [] возвращает ссылку на n-ю позицию контейнера векторов!